2011-05-09 76 views
6

我創建了一個新的WPF應用程序,併爲MainWindow中的Loaded事件添加了一個事件處理程序:WPF:如果Loaded事件中發生異常,應用程序不會崩潰

Loaded += (s, e) => { throw new Exception("AAAA!"); }; 

然後我從Visual C#啓動此應用程序,應用程序不會崩潰也不顯示未捕獲的異常。

我希望它會崩潰,這個應用程序確實在其他計算機上崩潰了。但爲什麼它適用於我的?

更新 添加了一個截圖:screenshot

+2

由於該應用程序是爲「任何CPU」編譯的,而且您正在運行64位操作系統? – 2011-05-09 10:42:24

+0

@Cody Gray它是爲x86編譯的,我運行的是64位操作系統。將其更改爲「任何CPU」,並且應用程序崩潰。有趣。 – meze 2011-05-09 10:46:52

+0

Argh,我用'Thread.Sleep'玩過,現在如果它編譯爲「Any CPU」,它不會崩潰。 – meze 2011-05-09 10:53:30

回答

4

加載的事件propably從後臺線程調用。當在這個線程中拋出異常時,它將被終止,但不會影響你的主應用程序線程。這種行爲可以在許多事件處理程序中看到,例如,一個Timer_Elapsed事件處理程序也不會影響你的代碼。 這並不意味着你不應該在意這些代碼中的異常!

+0

我該如何檢查?在拋出異常之前,我添加了'Thread.Sleep(1000)',整個窗口掛起1秒。所以我期望他們在同一個線程中。 – meze 2011-05-09 11:08:56

+0

您可以嘗試使用this.Dispatcher.Thread來檢測Thread.Current並檢查this.Dispatcher.CheckAccess()的結果。但是,也許你不需要,你想達到什麼目的? (FU'2答案和我上面的評論,那些似乎是在同一條線索......) – eFloh 2011-05-10 10:13:47

+2

作爲一名開發人員,我希望我的應用程序崩潰,如果我沒有捕獲所有異常。我不希望我的應用程序在發生故障時繼續運行。我也不明白爲什麼'Loaded'會被另一個線程觸發。我只是試過這個:'Loaded + =(s,e)=> {if(this.Dispatcher.Thread.Equals(Thread.CurrentThread))Thread.Sleep(4000);拋出新的異常(「AAAA!」); };'。該窗口凍結4秒,然後一切都很好,沒有「此應用程序已停止工作」對話框。 – meze 2011-05-10 15:31:05

6

要捕捉異常,您需要在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線程上拋出的新異常。

+0

是的,我知道。但是當我沒有'DispatcherUnhandledException'時,爲什麼我沒有看到標準的Windows對話框「Application has stopped working」? – meze 2011-05-09 10:58:47

+0

如果您希望應用程序崩潰,則必須在ui線程上引發異常。嘗試在異常處理程序中引發新的異常。 – 2011-05-09 12:23:16

+0

@meze:更新我的答案與崩潰的版本:-) – 2011-05-09 12:25:16

相關問題