使用 asp.net webapi 和 TPL 捕获未处理的异常

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,我不想介绍它们。

i3a*_*non 3

从正在运行的任务内部抛出的异常不会被处理。他们因这项任务而被捕,并把它变成了错误。

处理这些异常的正确方法是等待每个任务,或者使用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 次

最近记录:

10 年,2 月 前