如果Windows Forms程式中有未被捕獲的異常,會導致程式崩潰並且給使用者造成不良的印象。例如下面的程式,類比了一個未捕獲的異常:
按鈕事件為:
private void button1_Click(object sender, EventArgs e){ throw new Exception();}
點擊Exception 按鈕,會彈出如下預設視窗
Windows Forms提供了兩個事件來處理未捕獲的異常發生時的情況,分別是 Application.ThreadException和AppDomain.UnhandledException事件,前者用來處理UI線程中的異常,後者處理其他線程中的異常。要使程式使用自訂的事件來處理異常,可以使用如下代碼:
//處理未捕獲的異常 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); //處理UI線程異常 Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); //處理非UI線程異常 AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); #region 處理未捕獲異常的掛鈎函數 static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { Exception error = e.Exception as Exception; if (error != null) { LogRecord.putErrorLog(string.Format("出現應用程式未處理的異常/n異常類型:{0}/n異常訊息:{1}/n異常位置:{2}/n", error.GetType().Name, error.Message, error.StackTrace), "main"); } else { LogRecord.putActionLog(string.Format("Application ThreadError:{0}", e)); } } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { cn.ccets.papercontrol.FullScreenHandle.ShowTray(); Exception error = e.ExceptionObject as Exception; if (error != null) { LogRecord.putActionLog(string.Format("Application UnhandledException:{0};/n堆棧資訊:{1}", error.Message, error.StackTrace)); } else { LogRecord.putActionLog(string.Format("Application UnhandledError:{0}", e)); } } #endregion