首页 > 解决方案 > 全局异常处理程序可以处理等待函数中的异常吗?

问题描述

我有一个 WPF 桌面应用程序,它在后台线程中调用任务,如下所示:

private async void SomeButton_Click(object sender, EventArgs e)
{
  await Task.Run(async () =>
  {
    await DoSomething();
  });      
}

public async Task DoSomething()
{
  //do something that throws an exception, mocked like this
  throw new Exception("Test");
}

我在 App 启动中有顶级异常处理程序,如下所示:

this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

这些处理程序都只是将异常记录到文件中。

如果我将 的全部内容DoSomething放在 try/catch 块中,则 catch 起作用并且任务完成。

但是,如果抛出了不在 try/catch 中的异常,则将调用CurrentDomain_UnhandledException处理程序但该IsTerminating属性为 true,并且应用程序崩溃。

如何设置一个全局异常处理程序来处理异常而不使我的进程崩溃,而不必将 try/catch 处理放在可能在非 Dispatcher 线程上调用的每个方法中?

标签: .netwpfmultithreadingexception-handling

解决方案


OnDispatcherUnhandledException事件处理程序中,您应该将Handled属性设置为true.

private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
   // log
   e.Handled = true;
}

推荐阅读