繁体   English   中英

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

[英]Catching unhandled exceptions with asp.net webapi and TPL

我有一个场景,我在其中创建任务作为Webapi调用的一部分。 当任务中发生异常时,它不会被捕获,我无法弄清楚如何为此实现全局异常处理程序。

特别是:

如果您认为上述任何一项工作都应该让我知道,我会想出一个可重复的小例子,我正在观察。 否则,这样做的正确方法是什么?

[HttpGet]
public IQueryable<Thingies> Thingies()
{
    Task.Run(() => { throw new ApplicationException("How do I catch all of these globally?"); });
    return _db.Thingies;
}

我还应该注意,应用程序没有依赖于System.Web ,我不想介绍它们。

使用async-await而不是直接使用Task,异常处理将直接如下:

try
{
  // Asynchronous implementation.
  await Task.Delay(1000);
}
catch (Exception ex)
{
  // Handle exceptions.
}

或者,如果您仍然需要使用任务,请按照此处所述继续使用: 如何使用ContinueWith正确管理任务中的异常

从正在运行的任务中抛出的异常不会被处理。 他们被捕获在该任务上,使其出现故障。

处理这些异常的正确方法是等待每个任务,或使用Task.ContinueWith注册continuation。 但是,如果需要全局处理程序,则可以使用TaskScheduler.UnobservedTaskException事件。

当任务中有异常时,它会被处理并存储在Task对象上供您观察。 如果任务被垃圾收集并且任何代码都没有观察到异常.Net知道它永远不会被观察到(因为你没有对任务的引用)并且引发​​了TaskScheduler.UnobservedTaskException事件(在.Net中) 4.0它也会使应用程序崩溃,并且该行为也可以在较新的版本中复制)。

因此, TaskScheduler.UnobservedTaskException的事件处理程序将全局处理从任务引发的所有异常,但只有在它们已经GCed(不是立即)之后:

TaskScheduler.UnobservedTaskException += (sender, args) => HandleException(args.Exception);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM