[英]Entity Framework; How to handle an exception in foreach loop and keep iterating
[英]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.