我需要一个for循环,它将完成所有的迭代,即使在任何一个迭代中都有任何异常。
答案 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;运行时必须做那么多额外的工作。如果没有发生任何例外,那将是浪费。
而是将例外视为例外。这是异常发生的事情:超出您设计的输入考虑因素。当然,这只是一个建议,如果你真的需要继续循环,请选择上面提到的两个选项。