2009-10-21 52 views
23

C#程序被調用:嘗試/抓住整個C#程序可能嗎?

Application.Run (new formClass()); 

我想提出一個try/catch周圍的整個事情捕獲任何未捕獲的異常。當我將其放在Run方法中時,異常不會被捕獲;當程序在未捕獲的異常之後終止時,控制僅返回此處。

我可以在哪裏放置try/catch來覆蓋整個程序?謝謝!

+4

我認爲你錯過了異常處理的要點,如果異常冒泡到應用程序的最頂層,那麼就會出現錯誤,需要在代碼中降低代碼。將try/catch代碼放在你認爲可能失敗的地方,並在catch中提供緩解(可能的話)。如果無法緩解,即應用程序無法恢復,則應用程序需要失敗。 – Lazarus 2009-10-21 14:56:02

+13

OP不問如何使用例外 - 只是在特定情況下如何捕捉它們。很明顯,如果一個異常冒泡到最上層,那麼就會出現一些錯誤 - 似乎他想在問題出現時找到更多的信息,這樣就可以解決問題。米奇的回答比假設他不知道自己在做什麼更有幫助。 – Maggie 2009-10-21 15:05:57

+9

捕捉頂級的所有異常對於最終報告退出前發生的情況非常有用。在很多情況下,我認爲這比看到標準的Windows「這個程序崩潰了,請將此報告給Microsoft」對話框更好。 – noctonura 2009-10-21 15:12:00

回答

37

要捕獲Windows窗體的未處理異常,請掛接 AppDomain.UnhandledExceptionApplication.ThreadException事件。

有趣的是:Unexpected Errors in Managed Applications

+2

@alankdkd:請確保您閱讀到最後以及「一些最佳實踐」部分;) – Lazarus 2009-10-21 15:09:39

+1

您無法使用AppDomain.UnhandledException捕獲異常(它仍將終止應用程序),而只是得到通知。與Application.ThreadException相比,這是一個重要的區別,它是一個異常捕獲。 – Lucero 2009-10-21 15:13:33

+0

我無法使UnhandledException正常工作。我試過了:

 AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler); 
但是當有一個異常時,MyHandler永遠不會被調用。 我會嘗試ThreadException ... – user20493 2009-10-21 15:45:27

8

基本上,你可以不使用宿主進程的默認CLR時捕獲所有異常。期。這是因爲AppDomain.UnhandledException事件只是一個通知,您無法處理異常(這意味着您無法阻止應用程序在處理通知後終止)。

但是,您可以使用它的Application.ThreadException處理程序(和control the behavior通過UnhandledExceptionMode)捕獲並處理WinForms應用程序的UI線程中的所有異常。其他拋出異常的線程不會被這個處理程序捕獲。

一般來說,嘗試處理所有異常並不是一個好主意。但是,您可以使用 AppDomain.UnhandledException來記錄錯誤和/或執行重要的清理任務(例如關閉基於文件的數據庫或其他任何內容)。