我創建了一個新的WPF應用程序,併爲MainWindow中的Loaded事件添加了一個事件處理程序:WPF:如果Loaded事件中發生異常,應用程序不會崩潰
Loaded += (s, e) => { throw new Exception("AAAA!"); };
然後我從Visual C#啓動此應用程序,應用程序不會崩潰也不顯示未捕獲的異常。
我希望它會崩潰,這個應用程序確實在其他計算機上崩潰了。但爲什麼它適用於我的?
更新 添加了一個截圖:
我創建了一個新的WPF應用程序,併爲MainWindow中的Loaded事件添加了一個事件處理程序:WPF:如果Loaded事件中發生異常,應用程序不會崩潰
Loaded += (s, e) => { throw new Exception("AAAA!"); };
然後我從Visual C#啓動此應用程序,應用程序不會崩潰也不顯示未捕獲的異常。
我希望它會崩潰,這個應用程序確實在其他計算機上崩潰了。但爲什麼它適用於我的?
更新 添加了一個截圖:
加載的事件propably從後臺線程調用。當在這個線程中拋出異常時,它將被終止,但不會影響你的主應用程序線程。這種行爲可以在許多事件處理程序中看到,例如,一個Timer_Elapsed事件處理程序也不會影響你的代碼。 這並不意味着你不應該在意這些代碼中的異常!
我該如何檢查?在拋出異常之前,我添加了'Thread.Sleep(1000)',整個窗口掛起1秒。所以我期望他們在同一個線程中。 – meze 2011-05-09 11:08:56
您可以嘗試使用this.Dispatcher.Thread來檢測Thread.Current並檢查this.Dispatcher.CheckAccess()的結果。但是,也許你不需要,你想達到什麼目的? (FU'2答案和我上面的評論,那些似乎是在同一條線索......) – eFloh 2011-05-10 10:13:47
作爲一名開發人員,我希望我的應用程序崩潰,如果我沒有捕獲所有異常。我不希望我的應用程序在發生故障時繼續運行。我也不明白爲什麼'Loaded'會被另一個線程觸發。我只是試過這個:'Loaded + =(s,e)=> {if(this.Dispatcher.Thread.Equals(Thread.CurrentThread))Thread.Sleep(4000);拋出新的異常(「AAAA!」); };'。該窗口凍結4秒,然後一切都很好,沒有「此應用程序已停止工作」對話框。 – meze 2011-05-10 15:31:05
要捕捉異常,您需要在Loaded方法中執行try/catch,或者可以讓Dispatcher在發生未處理的異常時通知您。
嘗試以下,例如在應用程序的OnStartup方法:
App.Current.DispatcherUnhandledException += (s,e) =>
{
// Handle the exception here
var ex = e.Exception;
};
編輯:
如果你要崩潰了,那麼應用程序請嘗試以下操作:
App.Current.DispatcherUnhandledException += (s,e) =>
{
// this should cause your application to crash :-)
throw new Exception("Now it should crash!", e.Exception);
};
這裏的區別是我們創建了一個在UI線程上拋出的新異常。
是的,我知道。但是當我沒有'DispatcherUnhandledException'時,爲什麼我沒有看到標準的Windows對話框「Application has stopped working」? – meze 2011-05-09 10:58:47
如果您希望應用程序崩潰,則必須在ui線程上引發異常。嘗試在異常處理程序中引發新的異常。 – 2011-05-09 12:23:16
@meze:更新我的答案與崩潰的版本:-) – 2011-05-09 12:25:16
由於該應用程序是爲「任何CPU」編譯的,而且您正在運行64位操作系統? – 2011-05-09 10:42:24
@Cody Gray它是爲x86編譯的,我運行的是64位操作系統。將其更改爲「任何CPU」,並且應用程序崩潰。有趣。 – meze 2011-05-09 10:46:52
Argh,我用'Thread.Sleep'玩過,現在如果它編譯爲「Any CPU」,它不會崩潰。 – meze 2011-05-09 10:53:30