全局异常处理程序可以在等待的函数中处理异常吗?

时间:2018-08-29 19:15:10

标签: .net wpf multithreading exception-handling

我有一个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块中,则捕获工作正常,任务完成。

但是,如果引发了try / catch中没有的异常,则会调用CurrentDomain_UnhandledException处理程序 ,但是IsTerminating属性为true,并且应用崩溃。

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

1 个答案:

答案 0 :(得分:0)

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

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