C#抛出异常而不会破坏循环

时间:2013-03-27 07:09:08

标签: c# for-loop exception-handling

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 个答案:

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

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