我需要一个 for 循环来完成它的所有迭代,即使在任何一次迭代中都有任何异常。
7 回答
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 { }
}
}
好吧,事情是……您的解决方案必须包含一个 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 { }
}
这有利于使循环中的代码可重用。
您知道异常是什么以及会导致什么吗?你能测试它并防止它被抛出,即。CanCompleteStep 或 TryCompleteStep。如果您无法完成,请跳过该步骤。然后,您可以将异常处理置于循环之外。
循环中没有内置功能可以做到这一点。这不是 C# 中内置的语言功能,它不会自动处理异常并继续循环。
此外,请尽可能避免将 try-catch 块放入循环中。即使它解决了您提到的问题,请考虑编译器和运行时必须做那么多额外的工作。如果没有异常发生,那一切都会白费。
相反,让例外成为例外。这是异常发生的事情:在您设计的输入考虑之外。当然,这只是一个建议,如果你真的要继续循环,请使用上面建议的两个选项。