我运行的解决方案包含 2 个项目:应用程序和 SDK。
通过应用程序,我创建了一个 sdk 实例,以便应用程序可以启动。问题是,当我在任务内部运行的部分代码中遇到异常时,不会抛出任何未处理的异常,因此我的应用程序继续运行并且没有意识到 SDK 中发生了意外情况。
我在 App 和 SDK 中注册了 AppDomain.CurrentDomain.UnhandledException
的事件,但是如前所述,当在任务中抛出异常时,事件处理程序没有被调用。
有什么我想念的吗?
最佳答案
两个答案都有些(但不完全)完整。
异步
处理故障任务的最佳方法是使用await
异步等待让它完成.这将重新抛出原始存储的异常:
try
{
await task;
}
catch (Exception e)
{
// handle exception
}
同步
如果您不能(或不想)这样做,您也可以使用 task.Wait()
它同步等待并抛出一个 AggregateException
在 InnerExceptions
中包含原始异常或者注册一个处理它的延续(即 task.ContinueWith(t => // handle exception)
)
UnobservedTaskException
在 .Net 4.0 中,未观察到的 Task 异常会导致整个过程中断。 TaskScheduler.UnobservedTaskException
事件是崩溃前处理异常的最后一个选项(非常类似于 UnhandledException
的情况)。在 .Net 4.5 中,此类异常不再使应用程序崩溃,但事件仍会引发。
如果您想在这种情况下让应用程序崩溃(我怀疑您会这样做),您可以设置 <ThrowUnobservedTaskExceptions enabled="true"/>
正如尤瓦尔指出的那样。您可以改为使用事件本身来处理异常,这不是最佳的,原因有两个:
- .Net 决定您的任务的异常只有在任务被垃圾收集时才被观察到,这可能随时发生(或者永远不会,如果您不释放对它的所有引用)。在那之前,您仍然可以自己处理异常,所以它还没有被观察到。
- 您得到了异常,但没有得到任务,如果没有它,可能很难知道问题的真正根源。
结论
确保await
在异常发生时处理异常的任务。也可以使用 UnobservedTaskException
以防万一您错过了任务。
关于c# - 任务异常管理c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27901852/