對於簡單的「僅供內部使用」的應用程序,Winforms有一個有用的默認異常處理程序,它允許「忽略」,並告訴您異常是什麼。對WPF應用程序使用winforms默認異常處理程序
WPF應用程序似乎沒有得到這個漂亮的異常處理 - 你總是必須退出應用程序。
很明顯,我可以爲WPF編寫自己的默認異常處理程序,但有沒有簡單的方法來使用必須已經在Winforms框架中的WPF?
對於簡單的「僅供內部使用」的應用程序,Winforms有一個有用的默認異常處理程序,它允許「忽略」,並告訴您異常是什麼。對WPF應用程序使用winforms默認異常處理程序
WPF應用程序似乎沒有得到這個漂亮的異常處理 - 你總是必須退出應用程序。
很明顯,我可以爲WPF編寫自己的默認異常處理程序,但有沒有簡單的方法來使用必須已經在Winforms框架中的WPF?
我認爲這個問題有兩個部分:如何掛鉤自己的異常處理程序以允許應用程序繼續以及是否可以重用Windows窗體未處理的異常UI。
有關第一部分,請參閱Application.DispatcherUnhandledException。如果您訂閱了此事件,並且您的事件處理程序將DispatcherUnhandledExceptionEventArgs.Handled設置爲true,那麼WPF將跳過默認的未處理的異常處理 - 即應用程序不會自動關閉。 (當然,您的事件處理程序仍然可以關閉它。)默認情況下,處理未設置爲true,因此您必須明確地執行此操作。
對於第二部分,請參閱System.Windows.Forms.ThreadExceptionDialog。這是官方的「不打算用於你的代碼」,並且沒有以任何有用的方式記錄下來,因此將它用於生產應用程序並不明智。但是,如果你願意冒險,那麼你可以創建這個類的實例和ShowDialog()它。在.NET 3.5中,它返回DialogResult.Cancel表示「忽略異常並繼續」,而DialogResult.Abort表示「退出」。這些值沒有記錄,應該視爲實現細節!
好的,我在WinForms源代碼中找到了一些東西,結果發現標準的Winforms異常對話框是公開的。所以,你需要使用WPF風格DispatcherUnhandledException處理程序,做這樣的事情:
void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{
using (ThreadExceptionDialog dlg = new ThreadExceptionDialog(e.Exception))
{
DialogResult result = dlg.ShowDialog();
if (result == DialogResult.Abort)
{
Environment.Exit(-1);
}
else if (result == DialogResult.Cancel)
{
e.Handled = true;
}
}
}
您需要添加到System.Windows.Forms的引用,並且可能需要與命名空間略有您的應用程序播放類,但其他人可能會發現它適用於簡單的實用程序應用程序。
非常感謝這一點 - 您在閱讀源代碼的同時正在編寫它......就像您說的那樣,它絕對是「僅供內部使用」 - 我有點驚訝ThreadExceptionDialog是公開的。 – 2009-10-26 10:55:21