void function() {
try
{
// do something
foreach (item in itemList)
{
try
{
//do something
}
catch (Exception ex)
{
throw new Exception("functionB: " + ex.Message);
}
}
}
catch (Exception ex)
{
LogTransaction(ex.Message);
}
}
嗨,我想将for循环中的异常抛给它的父节点。目前,当for循环中存在异常时,循环将终止。 无论如何都要修改它以便抛出异常但循环会继续吗?
答案 0 :(得分:19)
不,你不能从循环中抛出异常并继续迭代它。但是,您可以将异常保存在数组中并在循环后处理它们。像这样:
List<Exception> loopExceptions = new List<Exception>();
foreach (var item in itemList)
try
{
//do something
}
catch (Exception ex)
{
loopExceptions.Add(ex);
}
foreach (var ex in loopExceptions)
//handle them
答案 1 :(得分:1)
你必须在循环中构建一个try-catch-block,不要再次抛出异常。
答案 2 :(得分:0)
这个怎么样?
void function() {
var IsCompleted = false;
try
{
// do something
foreach (item in itemList)
{
try
{
//do something
}
catch (Exception ex)
{
throw new Exception("functionB: " + ex.Message);
}
var IsCompleted = true;
}
}
catch (Exception ex)
{
LogTransaction(ex.Message);
}
If (!IsCompleted)
function();
}
答案 3 :(得分:0)
throw
语法是隐式设计的,用于中断执行,并使用catch语法将堆栈'冒泡'到最近的调用者。
一旦捕获到异常,就没有办法恢复循环的执行,就像(比方说)Classic ASP或VB Script一样。
关键是异常应该是罕见的。它们不应该用作控制应用程序流的方法。
如果您的意图是希望允许其他内容来处理错误,那么您应该构建代码,以便传入错误处理程序。
这方面的一个例子是:
void Process(IEnumerable<object> data, Action<object, Exception> handleError)
{
foreach(var o in data)
{
try
{
// do something
}
catch(Exception ex)
{
handleError(o, ex);
}
}
}
这样打电话:
Process(data, (obj, ex) => RequeueForProcessingDueToError(obj.Id, ex.Message));
这允许您传入处理错误功能的委托。您可以通过多种方式传递委托:事件,例如另一个。