【发布时间】:2010-09-21 15:56:24
【问题描述】:
在我处理的应用程序中,任何业务逻辑错误都会引发异常,调用代码会处理异常。这种模式在整个应用程序中都使用并且运行良好。
我有一种情况,我将尝试从业务层内部执行一些业务任务。对此的要求是一项任务的失败不应导致进程终止。其他任务应该仍然能够执行。换句话说,这不是原子操作。我遇到的问题是,在操作结束时,我希望通过抛出异常来通知调用代码确实发生了一个或多个异常。考虑以下伪代码 sn-p:
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 将是抛出集合异常的一个很好的解决方案。
【问题讨论】:
-
只需重新抛出异常。在你记录它(并做任何其他事情)之后,重新抛出它,让它在堆栈中冒泡。
-
哪个例外?我的场景预设了多个例外。
-
我刚刚更新了我的答案,指出您可以在 .NET 3.5 上克隆 AggregateException,以便在发布时轻松升级到真正的 .NET 4.0 类型。您仍然需要编写代码(克隆类),但它是向前兼容的。
-
布拉德利,我看到了。我想我会采取类似的方法。我正在编写一个名为 CollatedException 的类,因此它具有不同的名称,但我在 AggregateException 对其进行建模。 4.0出来的时候我可能会替换它。
-
@Jason Jackson:这听起来是个不错的选择。如果事实证明最终的 .NET 4.0 类不合适/不能使用,您的代码可以保持不变。否则,应该很容易重构以将您的代码与最新框架统一。