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

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

7 ответов


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

просто поместите каждую итерацию внутри попытки..лови

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

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

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 { }
    }
}

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

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

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


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

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

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

    EmployeesList.ForEach(ProcessEmployee);

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

это имеет преимущество сделать код в вашем цикле многоразовым.


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


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

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

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