如何处理循环中的异常并继续迭代?

时间:2009-02-19 07:00:23

标签: c# for-loop

我需要一个for循环,它将完成所有的迭代,即使在任何一个迭代中都有任何异常。

7 个答案:

答案 0 :(得分:32)

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

答案 1 :(得分:9)

将每个迭代放在try..catch

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

答案 2 :(得分:4)

或者,如果这是您程序中的重复模式,并且您承担了此捕获所有异常样式的风险,请将其包装为集合的扩展名。将它应用于上一个示例:

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

答案 3 :(得分:0)

嗯,问题是......你的解决方案必须包含一个for循环和某种错误/异常处理过程,所以你可能不得不在for循环中嵌入一个try catch语句。

如果抛出异常,则无法像未抛出异常那样完成一次迭代。但是,通过使用try catch,您可以确保循环执行所有那些不会抛出异常的迭代。

如果您需要有关在for循环中嵌入异常处理的帮助,请使用teedyay发布的示例!

答案 4 :(得分:0)

我认为值得注意的是,如果您使用的是通用列表 - 您可以使用以下内容来迭代集合:

ForEach(行动)

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

    EmployeesList.ForEach(ProcessEmployee);

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

这样可以使循环中的代码重用。

答案 5 :(得分:0)

你知道异常是什么以及会导致什么?你可以测试它并防止它被抛出,即。 CanCompleteStep或TryCompleteStep。如果你不能完成就跳过那一步。然后,您可以将异常处理放在循环之外。

答案 6 :(得分:-5)

没有内置功能循环来做到这一点。这不是C#中内置的语言功能,它将自动处理异常并继续循环。

同样在可能的范围内,请避免在循环中放置try-catch块。即使它解决了你提到的问题,也要考虑编译器&amp;运行时必须做那么多额外的工作。如果没有发生任何例外,那将是浪费。

而是将例外视为例外。这是异常发生的事情:超出您设计的输入考虑因素。当然,这只是一个建议,如果你真的需要继续循环,请选择上面提到的两个选项。