任务异常管理c#

use*_*804 4 .net c# exception-handling task-parallel-library async-await

我运行一个包含2个项目的解决方案:app和sdk.

通过应用程序,我创建了一个sdk的实例,以便应用程序可以启动.问题是,当我在Task内部运行的代码中遇到Exception时,不会抛出Unhandled Exception,因此我的应用程序一直在运行,并且没有意识到SDK中发生了意外情况.

AppDomain.CurrentDomain.UnhandledException在App和SDK中注册了该事件,但正如在任务中抛出异常时所述,不会调用事件处理程序.

有什么东西我错过了吗?

i3a*_*non 5

两个答案都有些(但不完全)完整.

异步

处理故障任务的最佳方法是异步等待它完成使用await.这将重新抛出原始存储的异常:

try
{
    await task;
}
catch (Exception e)
{
    // handle exception
}
Run Code Online (Sandbox Code Playgroud)

同步

如果你不能这样做(或者不想),你也可以使用task.Wait()同步等待并抛出AggregateException包含原始异常的内容InnerExceptions或者注册一个处理它的延续(即task.ContinueWith(t => // handle exception))

UnobservedTaskException

在.Net 4.0中,未观察到的任务异常会导致整个过程失效.该TaskScheduler.UnobservedTaskException事件是崩溃前处理异常的最后一个选项(非常类似于UnhandledException).在.Net 4.5中,这种类型的异常不再崩溃应用程序,但事件仍然会引发.

如果你想在这种情况下崩溃应用程序(我怀疑你这样做)你可以设置<ThrowUnobservedTaskExceptions enabled="true"/>为Yuval指出.您可以使用事件本身来处理由于以下两个原因而不是最佳的异常:

  1. .Net决定你的任务的异常只有当任务被垃圾收集时才会被观察到,这可能随时发生(或者永远不会,如果你没有释放对它的所有引用).在此之前,您仍然可以自己处理异常,因此尚未观察到.
  2. 你得到了例外,但不是任务,没有它就很难知道问题的真正根源.

结论

确保await您的任务在发生异常时进行处理.UnobservedTaskException如果您错过任务,也可以用作捕获所有内容.