У меня есть настольное приложение 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");
}
У меня есть обработчики исключений верхнего уровня при запуске приложения, такие как:
this.Dispatcher.UnhandledException += OnDispatcherUnhandledException;
AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;
и все эти обработчики просто записывают исключение в файл.
Если я помещу все содержимое DoSomething
в блок try / catch, то перехват срабатывает, и Задача завершается.
Но если выдается исключение, которое отсутствует в try / catch, вызывается обработчик CurrentDomain_UnhandledException
, , но свойство IsTerminating
имеет значение true, и приложение вылетает.
Как я могу настроить глобальный обработчик исключений, который будет обрабатывать исключение, не прерывая мой процесс, не прибегая к обработке try / catch в каждом отдельном методе, который может быть вызван в потоке, отличном от Dispatcher?