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

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

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

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

 people.ForEachIgnorant(ofThrowingWorkOnPerson); 

要么:

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

执行:

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

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

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

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

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

ForEach(行动)

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

  EmployeesList.ForEach(ProcessEmployee); void ProcessEmployee(Employee employeeItem) { try { ... } catch { } } 

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

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

循环中没有内置function可以做到这一点。 这不是C#中内置的语言function,它将自动处理exception并继续循环。

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

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