Я пытаюсь создать простой глобальный обработчик исключений в приложении WPF, который создается с помощью MVVM Light Toolkit, но мне сложно с ним работать.Глобальный обработчик исключений для приложения MVVM Light
Дело в том, что исключение Поднялся в модели представления не будет пойман в обработчике UnhandledException экране приложения, даже если я зарегистрировать прослушиватель как Dispatcher и AppDomain, как это:
private void Application_Startup(object sender, StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += DomainUnhandledException;
DispatcherUnhandledException += App_DispatcherUnhandledException;
}
private void DomainUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
{
var exception = unhandledExceptionEventArgs.ExceptionObject as Exception;
ShowExceptionMessage(exception);
}
private void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
ShowExceptionMessage(e.Exception);
e.Handled = true;
}
я нашел this blog post, который описывает проблему пятна на, с решением, описанным с этим кодом отрезал для просмотра моделей:
// Throw the exception in the UI thread.
App.Current.RootVisual.Dispatcher.BeginInvoke(() => { throw new MyException(); });
Однако я хотел бы, чтобы все исключения пузырем до глобального обработчика исключений, а не только те, что я-я в моей виртуальной машине.
Итак, вопрос: возможно ли повторное бросить исключения из других потоков в поток пользовательского интерфейса в одном месте?
Обновление: Добавлен более подробный код для установки обработчика событий приложения.
Извините, но я, очевидно, недостаточно исследовал эту проблему, прежде чем задавать вопрос. Исключение, которое я тестировал, фактически выбрано в конструкторе VM. Unity используется для DI, поэтому может возникнуть вопрос, как обрабатывать исключения в конструкторах на объектах, создаваемых единством? – Anttu
Чтобы объяснить немного далее, так как виртуальные машины привязаны к DataContext представления: DataContext = {{Binding MyVm, Source = {StaticResource Locator}} "'. Локатор раскрывает следующее свойство: 'public MyViewModel MyVm {get {return unityContrainer.Resolve(); }} ' –
Anttu