我参与维护的一个应用程序中,任何业务逻辑错误都会导致异常被抛出,然后调用代码会处理这个异常。这种模式在整个应用程序中都被使用,并且运行良好。
现在我面临这样一种情况:我需要在业务层内尝试执行多个业务任务,其中一个任务的失败不应该导致整个流程终止,其他任务仍应能够执行。换句话说,这不是一个原子操作。我的问题是,在操作结束时,我希望通过抛出异常来通知调用代码发生了一个或多个异常。以下是伪代码片段:
function DoTasks(MyTask[] taskList)
{
foreach(MyTask task in taskList)
{
try
{
DoTask(task);
}
catch(Exception ex)
{
log.add(ex);
}
}
//I want to throw something here if any exception occurred
}
我该抛出什么?我在我的职业生涯中遇到过这种模式。以前我曾经列出所有异常的列表,然后抛出一个包含所有捕获异常的异常。但这似乎不是最优雅的方法。重要的是要尽可能地保留每个异常的详细信息以便呈现给调用代码。
你有什么想法?
编辑:解决方案必须使用 .Net 3.5 编写。我不能使用任何 beta 库,或者像 Bradley Grainger(下面)提到的 .Net 4.0 中的 AggregateException 来收集异常并进行抛出。