我正在開發一個輕量級WPF MVVM框架,並希望能夠捕獲未處理的異常,並從中理想地恢復。在框架級別捕獲WPF異常
暫時忽略所有的很好的理由不這樣做,我會遇到以下情況:
如果我的App.xaml.cs的OnStartup方法內註冊AppDomain.CurrentDomain.UnhandledException處理程序,如下...
App.xaml.cs:
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException += new
UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler);
base.OnStartup(e);
}
void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea)
{
Exception e = (Exception)ea.ExceptionObject;
// log exception
}
,然後我的虛擬機的一個內引發異常,如預期的處理程序被調用。
到目前爲止,除了使用這種方法無法恢復的事實之外,我所能做的就是記錄異常,然後讓CLR終止應用程序。
我真正想要做的是恢復,並返回到主框架虛擬機的控制。 (再次摒棄這樣做的動機)。
所以,做一些閱讀,我決定在同一個地方登記爲AppDomain.CurrentDomain.UnhandledException的事件處理程序,這樣的代碼現在看起來是這樣的......
protected override void OnStartup(StartupEventArgs e)
{
AppDomain.CurrentDomain.UnhandledException +=
new UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler);
this.DispatcherUnhandledException +=
new DispatcherUnhandledExceptionEventHandler(DispatcherUnhandledExceptionHandler);
base.OnStartup(e);
}
void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea)
{
Exception e = (Exception)ea.ExceptionObject;
// log exception
}
void DispatcherUnhandledExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs args)
{
args.Handled = true;
// implement recovery
}
的問題是一旦我爲this.DispatcherUnhandledException註冊處理程序,無論是否調用了事件處理程序。因此,註冊DispatcherUnhandledExceptionHandler以某種方式停用AppDomain.CurrentDomain.UnhandledException的處理程序。
有沒有人有辦法從未處理的VM異常中捕獲和恢復?
提到在框架中沒有明確使用線程可能很重要。
謝謝Isak,知道我會捕獲所有可能產生的異常是很重要的。 – 2011-01-07 19:11:44