異常處理是每個應用程式都會用到的,縱然在程式編寫期間我們都會最大限度的考慮可能發生的異常並進行相應的處理,但是往往並不能完全考慮周全,百密一疏,出現未處理異常而導致程式出錯,資料丟失,如使用者輸入錯誤資料,網路斷開,資料庫連接失敗等等。這時系統會彈出錯誤視窗,無論對於自身的代碼安全還是良好的使用者體驗出發,這種現象都是不好的,一個健壯,成熟的應用程式應該有良好的容錯能力,並且在出錯後自動做出相應BUG的處理,記錄,本文和大家探討這種情況的一般處理方法,老鳥請直接飄過,都是些基礎。
原理:在應用程式進入點使用SetUnhandledExceptionMode處理未捕捉的異常,訂閱Application.ThreadException,AppDomain.CurrentDomain.UnhandledException事件,建立我們自己的異常處理方法,可以是開啟一個統一的異常處理表單告訴使用者發生了錯誤,然後記錄錯誤詳細資料,因為這旨在說明原理,這部分只是彈出資訊表示錯誤發生並記錄,大家可以根據自身實際需求做處理,如出錯後彈出一個漂亮的出錯提示表單,把出錯詳細資料記錄到文本、資料庫,發送出錯郵件到作者信箱或出錯後重新初始化等,這就是仁者見仁智者見智,大家自己做了。
示範程式功能:一個除零異常按鈕,一個顯示拋出異常按鈕,均為做TRY CATCH異常處理,發生錯誤後通過統一的未處理異常處理處理異常,在程式檔案夾下產生ErrLog/ ErrLog.txt檔案記錄詳細出錯資訊並彈出統一出錯表單,程式並不會發生BUG而異常關閉。程式下載:http://download.csdn.net/source/2601973
//處理未捕獲的異常,始終將異常傳送到 ThreadException 處理常式。忽略應用程式設定檔。 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //訂閱ThreadException事件,處理UI線程異常,處理方法為 Application_ThreadException,關於事件的相關知識就不在這敘述了 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //訂閱UnhandledException事件,處理非UI線程異常 ,處理方法為 CurrentDomain_UnhandledException AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); /// <summary> ///這就是我們要在發生未處理異常時處理的方法,我這是寫出錯詳細資料到文本,給大家做個參考 ///做法很多,可以是把出錯詳細資料記錄到文本、資料庫,發送出錯郵件到作者信箱或出錯後重新初始化等等 ///這就是仁者見仁智者見智,大家自己做了。 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { string str = ""; string strDateInfo = "出現應用程式未處理的異常:" + DateTime.Now.ToString() + "/r/n"; Exception error = e.Exception as Exception; if (error != null) { str = string.Format(strDateInfo + "異常類型:{0}/r/n異常訊息:{1}/r/n異常資訊:{2}/r/n", error.GetType().Name, error.Message, error.StackTrace); } else { str = string.Format("應用程式線程錯誤:{0}", e); } if (!Directory.Exists("ErrLog")) { Directory.CreateDirectory("ErrLog"); } writeLog(str); MessageBox.Show("發生致命錯誤,請及時聯絡作者!", "系統錯誤", MessageBoxButtons.OK, MessageBoxIcon.Error); }
轉載自:http://blog.csdn.net/smallwhiteyt/article/details/5793555