Про
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?