c# - 任务异常管理c#

标签 c# .net exception-handling async-await task-parallel-library

我运行的解决方案包含 2 个项目:应用程序和 SDK。

通过应用程序,我创建了一个 sdk 实例,以便应用程序可以启动。问题是,当我在任务内部运行的部分代码中遇到异常时,不会抛出任何未处理的异常,因此我的应用程序继续运行并且没有意识到 SDK 中发生了意外情况。

我在 App 和 SDK 中注册了 AppDomain.CurrentDomain.UnhandledException 的事件,但是如前所述,当在任务中抛出异常时,事件处理程序没有被调用。

有什么我想念的吗?

最佳答案

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

异步

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

try
{
    await task;
}
catch (Exception e)
{
    // handle exception
}

同步

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

UnobservedTaskException

在 .Net 4.0 中,未观察到的 Task 异常会导致整个过程中断。 TaskScheduler.UnobservedTaskException事件是崩溃前处理异常的最后一个选项(非常类似于 UnhandledException 的情况)。在 .Net 4.5 中,此类异常不再使应用程序崩溃,但事件仍会引发

如果您想在这种情况下让应用程序崩溃(我怀疑您会这样做),您可以设置 <ThrowUnobservedTaskExceptions enabled="true"/>正如尤瓦尔指出的那样。您可以改为使用事件本身来处理异常,这不是最佳的,原因有两个:

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

结论

确保await在异常发生时处理异常的任务。也可以使用 UnobservedTaskException以防万一您错过了任务。

关于c# - 任务异常管理c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27901852/

相关文章:

c# - Linq to Entities Distinct 从句

c# - 从 Windows Phone 8.1 通用应用程序的 View 模型导航到新页面

c# - Angular - 向 Owin+Web API Controller 发出带有参数的 HTTP GET 请求未找到

c# - 具有多个 ColorAnimations 的 Silverlight Storyboard

c# - 我应该在访问字典之前检查特定键是否存在于字典中吗?

java - 详细的异常捕获子句

c# - 获取2个字符串之间的差异

.net - 通过 jQuery.ajax 将文件夹路径字符串传递给 Web 服务函数时出现问题

c++ - 为什么不使用函数尝试 block 声明 main()?

c# - 我怎样才能在 C# 的异常中获取错误号而不是错误消息?