我有一个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处理?
答案 0 :(得分:0)
在OnDispatcherUnhandledException
事件处理程序中,您应该将Handled
属性设置为true
。
private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
// log
e.Handled = true;
}