[英]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.