【发布时间】:2012-06-05 17:15:18
【问题描述】:
我正在尝试在使用 MVVM Light Toolkit 构建的 WPF 应用程序中创建一个简单的全局异常处理程序,但我很难让它工作。
问题是视图模型中出现的异常不会被应用程序的 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 中的异常。
所以问题是:是否有可能以某种方式将其他线程的异常重新抛出到一个地方的 UI 线程中?
更新:为应用程序的事件处理程序设置添加了更详细的代码。
【问题讨论】:
-
很抱歉,在提问之前我显然没有对这个问题进行足够的调查。我测试的异常实际上是在 VM 构造函数中抛出的。 Unity 用于 DI,所以问题应该是,如何处理由 unity 创建的对象的构造函数中的异常?
-
为了进一步解释,这就是 VM 绑定到视图的 DataContext 的方式:
DataContext="{Binding MyVm, Source={StaticResource Locator}}"。定位器暴露了以下属性:public MyViewModel MyVm { get { return unityContrainer.Resolve<MyViewModel>(); } }
标签: wpf exception-handling mvvm-light