C# WINFORM應用程式未處理異常的統一處理技巧

來源:互聯網
上載者:User

異常處理是每個應用程式都會用到的,縱然在程式編寫期間我們都會最大限度的考慮可能發生的異常並進行相應的處理,但是往往並不能完全考慮周全,百密一疏,出現未處理異常而導致程式出錯,資料丟失,如使用者輸入錯誤資料,網路斷開,資料庫連接失敗等等。這時系統會彈出錯誤視窗,無論對於自身的代碼安全還是良好的使用者體驗出發,這種現象都是不好的,一個健壯,成熟的應用程式應該有良好的容錯能力,並且在出錯後自動做出相應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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.