C#程序被調用:嘗試/抓住整個C#程序可能嗎?
Application.Run (new formClass());
我想提出一個try/catch周圍的整個事情捕獲任何未捕獲的異常。當我將其放在Run方法中時,異常不會被捕獲;當程序在未捕獲的異常之後終止時,控制僅返回此處。
我可以在哪裏放置try/catch來覆蓋整個程序?謝謝!
C#程序被調用:嘗試/抓住整個C#程序可能嗎?
Application.Run (new formClass());
我想提出一個try/catch周圍的整個事情捕獲任何未捕獲的異常。當我將其放在Run方法中時,異常不會被捕獲;當程序在未捕獲的異常之後終止時,控制僅返回此處。
我可以在哪裏放置try/catch來覆蓋整個程序?謝謝!
要捕獲Windows窗體的未處理異常,請掛接 AppDomain.UnhandledException
和Application.ThreadException
事件。
@alankdkd:請確保您閱讀到最後以及「一些最佳實踐」部分;) – Lazarus 2009-10-21 15:09:39
您無法使用AppDomain.UnhandledException捕獲異常(它仍將終止應用程序),而只是得到通知。與Application.ThreadException相比,這是一個重要的區別,它是一個異常捕獲。 – Lucero 2009-10-21 15:13:33
我無法使UnhandledException正常工作。我試過了:
AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyHandler);但是當有一個異常時,MyHandler永遠不會被調用。 我會嘗試ThreadException ... – user20493 2009-10-21 15:45:27
基本上,你可以不使用宿主進程的默認CLR時捕獲所有異常。期。這是因爲AppDomain.UnhandledException
事件只是一個通知,您無法處理異常(這意味着您無法阻止應用程序在處理通知後終止)。
但是,您可以使用它的Application.ThreadException
處理程序(和control the behavior通過UnhandledExceptionMode
)捕獲並處理WinForms應用程序的UI線程中的所有異常。其他拋出異常的線程不會被這個處理程序捕獲。
一般來說,嘗試處理所有異常並不是一個好主意。但是,您可以使用 AppDomain.UnhandledException
來記錄錯誤和/或執行重要的清理任務(例如關閉基於文件的數據庫或其他任何內容)。
我認爲你錯過了異常處理的要點,如果異常冒泡到應用程序的最頂層,那麼就會出現錯誤,需要在代碼中降低代碼。將try/catch代碼放在你認爲可能失敗的地方,並在catch中提供緩解(可能的話)。如果無法緩解,即應用程序無法恢復,則應用程序需要失敗。 – Lazarus 2009-10-21 14:56:02
OP不問如何使用例外 - 只是在特定情況下如何捕捉它們。很明顯,如果一個異常冒泡到最上層,那麼就會出現一些錯誤 - 似乎他想在問題出現時找到更多的信息,這樣就可以解決問題。米奇的回答比假設他不知道自己在做什麼更有幫助。 – Maggie 2009-10-21 15:05:57
捕捉頂級的所有異常對於最終報告退出前發生的情況非常有用。在很多情況下,我認爲這比看到標準的Windows「這個程序崩潰了,請將此報告給Microsoft」對話框更好。 – noctonura 2009-10-21 15:12:00