為什麼 AppDomain 異常總是會終止應用程序?
這與上一個問題有關。
我現在想了解的是如何防止 UI 執行緒異常終止應用程序,而非 UI 異常則不能。
作為參考,請參閱此範例。
最重要的是,在這種情況下,我希望能夠“靜默”地終止程序——而不顯示詢問我是否要發送錯誤報告的 Windows 對話框。
這是我的 AppDomain UnhandledExceptionHandler:
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { try { // Maybe do some logging here if allowed } catch { } // then just terminate the application Application.Exit(); }更新
鑑於此答案中的評論,我想澄清一下,最重要的是,我想了解更多有關使 UI 執行緒能夠及早通過該
Application.ThreadException機制擷取未處理異常的機制的資訊。以及這種行為是否可以在非 UI 執行緒上實現。
在 Google 上進行了更多搜尋後,我發現這個非常有趣的解釋是針對Jeff Atwood 在他的部落格上描述的相同問題的。
大家好,很抱歉造成混亂。這種行為實際上是設計,儘管有時設計可能有點複雜。
首先要了解的是,UnhandledException 事件不是未處理的異常“處理程序”。註冊事件,與文件所說的相反:-(,不會導致處理未處理的異常。(從那時起它們不會被處理,但我將停止循環推理……)UnhandledException事件只是通知你一個異常沒有處理,以防你想在你的執行緒或應用程序死掉之前嘗試保存狀態。FWIW,我已經送出了一個錯誤來修復文件。
更複雜的是,在 v1.0 和 1.1 中,未處理的異常並不總是意味著您的應用程序會死掉。如果未處理的異常發生在主執行緒或以非託管程式碼開始其生命週期的執行緒以外的任何地方,則 CLR 會吃掉異常並允許您的應用程序繼續執行。這通常是邪惡的,因為經常會發生的情況是,例如,ThreadPool 執行緒會一個接一個地默默地死掉,直到您的應用程序實際上沒有做任何工作。找出這種失敗的原因幾乎是不可能的。這可能是 Jeff 認為它之前有效的原因……他總是看到非主執行緒上的崩潰。
在 v2.0 中,任何執行緒上的未處理異常都會導致應用程序崩潰。我們發現調試崩潰比調試掛起或上述靜默停止工作問題要容易得多。
順便說一句,在我的 1.1 機器上,來自 MSDN 的範例確實具有預期的輸出;只是在您附加調試器(或不附加)之後,第二行才會顯示。在 v2 中,我們進行了翻轉,以便在調試器附加之前觸發 UnhandledException 事件,這似乎是大多數人所期望的。
Jonathan Keljo CLR 異常 PM Jonathan Keljo 於 2005 年 2 月 18 日晚上 10:02
但是,我仍然對 UI 執行緒如何完成允許您為所有 UI 執行緒異常擁有一個包羅萬象的處理程序的技巧感興趣。
更重要的是,我對只為我的應用程序禁用 .NET JIT 調試對話框的方法非常感興趣(而不是為整個機器禁用它,如此處所示)