Может ли глобальный обработчик исключений иметь дело с исключениями в ожидаемой функции? - PullRequest
0 голосов
/ 29 августа 2018

У меня есть настольное приложение 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?

1 Ответ

0 голосов
/ 29 августа 2018

В обработчике событий OnDispatcherUnhandledException вы должны установить для свойства Handled значение true.

private void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
   // log
   e.Handled = true;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...