在基于捕获另一个异常而引发异常时,可以在InnerException
property中传递后者。
我正在执行许多清理程序。即使其中之一发生故障,我也想运行所有它们(因为它们可能需要整理临时保存的数据)。
同时,我不想吞下执行清除方法期间可能出现的异常。
一个简单的解决方案是将每个清理调用包装在try
-catch
块中,并将任何捕获的异常添加到列表中。执行完所有清理方法后,如果至少有一个异常,我仍然可以抛出...某些东西:
var exceptions = new List<Exception>();
foreach (var handler in handlers)
{
try
{
handler.CleanUp();
}
catch (Exception ex)
{
exceptions.Add(ex);
}
}
if (exceptions.Count > 0)
{
throw ...
}
现在,我的问题是: BCL中是否存在可以在此处抛出的预定义内容,并且可以传播所有捕获的异常?
我正在考虑一种异常,该异常具有一个InnerExceptions
属性,该异常包含多个异常。 (或者在这种情况下是否应该应用其他模式?)
答案 0 :(得分:4)
您正在寻找AggregateException
因此,在您的情况下,您可以使用重载的构造函数AggregateException(IEnumerable<Exception>)
if (exceptions.Count > 0)
{
throw new AggregateException(exceptions)
}
答案 1 :(得分:3)
是的,System.AggregateException
。正是这样,InnerExceptions。您可以在其构造函数之一like this one中添加内部异常的集合。