6
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循环出现异常时,循环会被终止。无论如何要修改它以便抛出异常但循环将继续?

4

4 回答 4

21

不,您不能从循环中抛出异常并继续迭代它。但是,您可以将异常保存在数组中并在循环后处理它们。像这样:

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
于 2013-03-27T07:12:32.593 回答
1

您必须在循环内构建一个 try-catch-block 并且不要再次抛出异常。

于 2013-03-27T07:10:25.527 回答
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();
}
于 2013-03-27T07:21:46.970 回答
0

throw语法被隐式设计为中断执行,并使用 catch 语法将堆栈“冒泡”到最近的调用者。

一旦捕获到异常,就没有办法恢复循环的执行,就像(比如)经典 ASP 或 VB 脚本中那样。

关键是例外应该是罕见的。它们不应用作控制应用程序流的方法。

如果您的意图是要允许其他东西来处理错误,那么您应该构建您的代码,以便您可以传入错误处理程序。

一个例子是:

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)); 

这允许您传入处理错误功能的委托。您可以通过多种方式传递委托:事件,例如成为另一个。

于 2013-03-27T07:28:44.800 回答