13

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

4

7 回答 7

35
for (...)
{
    try
    {
        // Do stuff
    }
    catch (Exception ex)
    {
        // Handle (or ignore) the exception
    }
}
于 2009-02-19T07:02:56.427 回答
10

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

foreach(Person a in people)
{
      try
      {
              WorkOnPerson(a);
      }
      catch
      {
              // do something if you want to.
       }
}
于 2009-02-19T07:02:54.523 回答
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 { }
    }
}
于 2009-02-19T08:47:49.590 回答
0

好吧,事情是……您的解决方案必须包含一个 for 循环和某种错误/异常处理过程,因此您可能必须在您的 for 循环中嵌入一个 try catch 语句。

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

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

于 2009-02-19T07:21:52.543 回答
0

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

ForEach(动作动作)

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

    EmployeesList.ForEach(ProcessEmployee);

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

这有利于使循环中的代码可重用。

于 2009-02-19T09:32:41.840 回答
0

您知道异常是什么以及会导致什么吗?你能测试它并防止它被抛出,即。CanCompleteStep 或 TryCompleteStep。如果您无法完成,请跳过该步骤。然后,您可以将异常处理置于循环之外。

于 2010-03-16T02:22:52.467 回答
-5

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

此外,请尽可能避免将 try-catch 块放入循环中。即使它解决了您提到的问题,请考虑编译器和运行时必须做那么多额外的工作。如果没有异常发生,那一切都会白费。

相反,让例外成为例外。这是异常发生的事情:在您设计的输入考虑之外。当然,这只是一个建议,如果你真的要继续循环,请使用上面建议的两个选项。

于 2009-02-19T07:05:02.740 回答