@romaro

Как централизованно обрабатывать исключения в WPF?

Про DispatcherUnhandledException я знаю, но есть проблема с кастомными ошибками.

Если создать собственное исключение, унаследовав его от Exception/ApplicationException и попрбовать выбросить в WPF-приложении, то, как я понял, не существует способа извлечь объект такого исключения из аргумента DispatcherUnhandledExceptionEventArgs, который принимается обработчиком Application_DispatcherUnhandledException.

Единственный способ, который мне пришел в голову, выглядит так:
if (labelSetup == null)
            {
                var dict = new ExeptionCultureNode {
                    Ru_RU = "Не найден сетап для печати тестовой этикетки",
                    En_US = "Not found setup for TestLabel printing"
                };
 
                var ex = new WpfLocalizedException(dict);
                throw new ApplicationException("", ex);
            }


То есть упаковываем свое исключение в стандартное. Тогда его можно извлечь в обработчике:
private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
        {
            var ex = e.Exception.InnerException;
 
            switch (ex)
            {
                case ISelfHandledException selfHandledException:
                    selfHandledException.Handle();
                    e.Handled = true;
                    break;
                default:
                    MessageBox.Show("Ошибка уровня приложения: " + e.Exception.Message, "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
                    break;
            }


Если сразу выбросить WpfLocalizedException, то e.Exception.InnerException окажется пуст.

Это действительно самый простой способ централизованно обрабатывать исключения в WPF?
  • Вопрос задан
  • 81 просмотр
Решения вопроса 1
twobomb
@twobomb
А причём тут InnerException? e.Exception и является экземпляром класса вашего кастомного исключения.
private void Current_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)   {
            if (e.Exception is WpfLocalizedException ex){
                  //ex.dicts //ваш объект к которому нужно обратится...
            }
          }
    }

Ну я надеюсь WpfLocalizedException наследуется от Exception
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы