Mic*_*ett 5 .net exception-handling async-await
我有一个表单应用程序,在几个点上做
await Task.WhenAll(list_of_tasks)
我的理解是,在这种情况下,如果list_of_tasks中的一个或多个任务抛出异常,"await"也将仅传播其中一个异常.(您可以检查每个任务,看看它失败的原因)
我的问题是:如果你有一个应用程序范围的异常处理程序,它记录了日志的所有异常,它如何记录list_of_tasks中抛出的每个异常的信息?(假设异常处理程序只会出现一个从await发出的异常,并且该异常不像AggregateException那样告诉你其他异常)
迈克尔
因此,正如您可能已经知道的那样,为了方便起见,await 解开 AggregateException,因为 Task.Exception 属性是 AggregateException 类型,如果它没有解开 - 您在等待某些任务时必须始终捕获AggregateException,然后再费心解开自己。
对于 Task.WhenAll 我认为这种行为确实不是您想要的。所有其他异常都被吞掉(因此被视为已观察到,并且不会到达 UnobservedTaskException 处理程序)。如果在这种情况下记录所有异常对您来说很重要,您可以编写一些扩展方法,如下所示:
static class TaskExtensions {
static async Task WhenAllAggregate(params Task[] tasks) {
var all = Task.WhenAll(tasks);
try {
await all;
}
catch {
// swallow caugth exception but throw all
throw all.Exception;
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后像往常一样在应用程序范围的处理程序中记录聚合异常。
| 归档时间: |
|
| 查看次数: |
545 次 |
| 最近记录: |