And*_*ykh 5 .net c# exception task-parallel-library asp.net-web-api
我有一个场景,我创建任务作为 Webapi 调用的一部分。当任务中发生异常时,它不会被捕获,并且我不知道如何为此实现全局异常处理程序。
尤其:
如果您认为上述任何一项应该有效,请告诉我,我将针对我所观察到的情况提出一个可重复的小示例。否则,这样做的正确方法是什么?
[HttpGet]
public IQueryable<Thingies> Thingies()
{
Task.Run(() => { throw new ApplicationException("How do I catch all of these globally?"); });
return _db.Thingies;
}
Run Code Online (Sandbox Code Playgroud)
我还应该注意的是,该应用程序没有依赖项System.Web,我不想介绍它们。
从正在运行的任务内部抛出的异常不会被处理。他们因这项任务而被捕,并把它变成了错误。
处理这些异常的正确方法是等待每个任务,或者使用Task.ContinueWith. 但是,如果您想要一个全局处理程序,您可以使用该TaskScheduler.UnobservedTaskException事件。
当任务中出现异常时,它会被处理并存储在Task对象上以供您观察。如果任务被垃圾收集并且任何代码尚未观察到异常,.Net 知道它永远不会被观察到(因为您没有对任务的引用)并引发事件TaskScheduler.UnobservedTaskException(在 .Net 4.0 中,它将也会使应用程序崩溃,并且该行为也可以在新版本中复制)。
因此,事件处理程序TaskScheduler.UnobservedTaskException将全局处理从任务引发的所有异常,但仅在它们被 GC 后(不是立即):
TaskScheduler.UnobservedTaskException += (sender, args) => HandleException(args.Exception);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1148 次 |
| 最近记录: |