循环处理多个异常

Handling multiple exceptions in a loop

在我的代码中,一个方法在循环中被重复调用,如下所示:

foreach (var file in files)
{
    SomeMethod(file);
}

该方法可能会抛出异常,但我不希望代码在第一个异常后退出循环。

此外,上面的代码是从网络 api 控制器调用的,所以我需要一种方法将所有异常信息传递回控制器,在那里将处理它(记录异常和 return错误响应给客户端)。

到目前为止我所做的是捕获所有异常并将其存储在列表中。

var errors = new List<Exception>();

foreach (var file in files)
{
    try
    {
        SomeMethod(file);
    }
    catch(Exception ex)
    {
        errors.Add(ex);
    }
}

考虑到重新抛出列表中的所有错误不是一种选择,return向控制器发送异常信息的最佳方法是什么?

使用AggregateException

您可以将 List<Exception> 传递给它的构造函数并抛出它。

在循环结束时执行:

AggregateException aggregateEx = new AggregateException(errors);
throw aggregateEx;

(或returnAggregateException

根据 Habib's 的建议,我实施了一种解决方案,该解决方案还可以处理只有一个异常的情况。这样就没有不必要的嵌套异常。

if (errors.Any())
{
    if (errors.Count > 1)
    {
        throw new AggregateException("Multiple errors. See InnerExceptions for more details",errors);
    }
    else
    {
        ExceptionDispatchInfo.Capture(errors[0]).Throw();
    }
}

应避免通过调用 throw errors[0]; 简单地重新抛出单个异常,因为它不会保留原始异常的堆栈跟踪。