繁体   English   中英

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

[英]How handle an exception in a loop and keep iterating?

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

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

只需将每个迭代放在try..catch中

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

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

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

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

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

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

ForEach(行动)

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

    EmployeesList.ForEach(ProcessEmployee);

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

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

循环中没有内置功能来执行此操作。 这不是C#中内置的语言功能,它将自动处理异常并继续循环。

另外,请尽量避免在循环中放置try-catch块。 即使它解决了你提到的问题,也要考虑编译器和运行时必须做更多的工作。 如果没有发生任何例外,那将是浪费。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM