В моем основном проекте asp.net у меня есть метод, который я обновляю строковое поле. Я проверяю, является ли это последним элементом, мне нужно показать ошибку. Но проблема в том, что я получаю ошибку, как и ожидалось: System.IndexOutOfRangeException: индекс находился за пределами массива.

Мои методы выглядят так:

[HttpPost("upgradeproject/{userId}/{projectId}")]
public async Task<IActionResult> UpgradeProject(int userId, int projectId)
{
    var projects = await _context.Projects.FirstOrDefaultAsync(x => x.Id == 
    projectId);
    var  kube= await _context.Kubesprays.Select(x => x.Version).ToListAsync();
    string[] sorted = kube
        .OrderBy(item => Version.Parse(Regex.Match(item, @"[0-9]+(?:\.[0- 
            9]+)+").Value))
        .ToArray();

    //var res = string.Join(Environment.NewLine, sorted);
    var currentVersion = projects.KubesprayTargetVersion;
    var nextVersion = sorted[Array.IndexOf(sorted, currentVersion) + 1];
    var last = sorted.Last();

    if (currentVersion == last)
    {
        return BadRequest("You are already using the latest release"); // want to 
        use this
    }

    if (currentVersion != nextVersion)
    {
        return BadRequest("Upgrade already in progress");
    }

    if (userId != int.Parse(User.FindFirst(ClaimTypes.NameIdentifier).Value))
        return Unauthorized();

    if (currentVersion == nextVersion)
    {
        projects.KubesprayTargetVersion = nextVersion;

        // Update entity in DbSet
        _context.Projects.Update(projects);
        await _context.SaveChangesAsync();
    }

    return Ok();
}
2
Arzu Suleymanov 13 Фев 2020 в 17:52

2 ответа

Лучший ответ

Я думаю, что лучше переписать код без получения Exception и проверить его таким образом:

var currentVersion = projects.KubesprayTargetVersion;
var currentVersionIndex = Array.IndexOf(sorted, currentVersion);

if (currentVersionIndex == sorted.Length - 1)
{
    return BadRequest("You are already using the latest release"); 
}

var nextVersion = sorted[currentVersionIndex + 1];
3
Kirk Larkin 13 Фев 2020 в 15:24

Это будет делать то, что вы хотите:

try
{
    // Whatever you are trying
}
catch (IndexOutOfRangeException)
{
    return BadRequest("Message");
}

Но лучше предотвратить исключение путем кодирования для проверки вне диапазона. Используя Linq: (пропустите количество элементов, соответствующих индексу версии, затем получите следующее, если есть)

    if (sorted.Contains(version))
    {
       var nextVersion = sorted.Skip(sorted.ToList().IndexOf(version) + 1).Take(1).FirstOrDefault();
    }
    else
    {
       return BadRequest("Message"); 
    }
3
JMP 14 Фев 2020 в 08:59