Как обрабатывать исключение в цикле и продолжать итерацию?

Мне нужен цикл for, который завершит все его итерации, даже если есть какое-либо исключение в любой из итераций.

Ответ 1

for (...)
{
    try
    {
        // Do stuff
    }
    catch (Exception ex)
    {
        // Handle (or ignore) the exception
    }
}

Ответ 2

Просто поставьте каждую итерацию внутри try..catch

foreach(Person a in people)
{
      try
      {
              WorkOnPerson(a);
      }
      catch
      {
              // do something if you want to.
       }
}

Ответ 3

Или, если это повторяющийся шаблон в вашей программе, , и вы рискуете этим уловить весь стиль исключения, добавьте его как расширение в свои коллекции. Применяя его к предыдущему примеру:

people.ForEachIgnorant(ofThrowingWorkOnPerson);

Или:

people.ForEachIgnorant(p => WorkOnPersonThatThrows(p));

Реализация:

public static void IgnorantForEach<T>(this IEnumerable<T> source, Action<T> action)
{
    foreach (var item in source)
    {
        try
        {
            action(item);
        }
        catch { }
    }
}

Ответ 4

Ну, дело в том... Ваше решение должно будет включать цикл for и какой-то процесс обработки ошибок/исключений, поэтому вам, вероятно, придется встроить инструкцию try catch в цикл for.

Если генерируется исключение, вы не сможете завершить эту итерацию так, как если бы исключение не было выбрано. Однако с помощью try catch вы можете убедиться, что ваш цикл выполняет все те итерации, которые не генерируют исключения.

Если вам нужна помощь по внедрению обработки исключений в цикле for, просто используйте пример, отправленный teedyay!

Ответ 5

Я думаю, что также стоит отметить, что если вы используете общий список - вы можете использовать следующее для повторения коллекции:

ForEach (действие действия)

http://msdn.microsoft.com/en-us/library/bwabdf9z.aspx

    EmployeesList.ForEach(ProcessEmployee);

    void ProcessEmployee(Employee employeeItem)
    {
        try
        {
            ...
        }
        catch { }
    }

Это имеет смысл сделать код в вашем цикле многократным.

Ответ 6

Знаете ли вы, что такое исключение и что вызовет его? Можете ли вы проверить это и предотвратить его бросание, т.е. CanCompleteStep или TryCompleteStep. если вы не можете закончить, просто пропустите этот шаг. Затем вы можете исключить обработку исключений из цикла.

Ответ 7

Для этого нет встроенной функции в цикле. Это не языковая функция, встроенная в С#, которая автоматически обрабатывает исключение и продолжит цикл.

Также, насколько это возможно, избегайте помещать блоки try-catch внутри цикла. Несмотря на то, что он решает проблему, о которой вы говорите, учтите, что компилятор и время выполнения должны выполнить эту дополнительную работу. Если бы не было никаких исключений, то все это было бы пустым.

Вместо этого исключения должны быть исключениями. Это то, что происходит исключительно: вне ваших соображений. Конечно, это только предположение, если вам действительно нужно продолжить цикл, перейдите к двум предложенным выше вариантам.