2010-11-01 19 views
7

我在想,是否可以「覆蓋」或可能替換標準winforms .net異常形式?替換.net中的標準異常/錯誤形式

我談論這個傢伙:

alt text

是否有可能,孔程序的範圍時,要重寫此窗口?我的意思是automaticaly,而不必執行try/catch。

謝謝!

丹尼爾

回答

2

您應該處理:

/// <summary> 
/// Main thread error handler. 
/// </summary> 
public sealed class ExceptionHandler 
{ 
    private ExceptionHandler() 
    {} 

    /// <summary> 
    /// Handles an exception on the main thread. 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="t"></param> 
    public static void OnThreadException(object sender, ThreadExceptionEventArgs t) 
    { 
     DialogResult result = DialogResult.Cancel; 
     try 
     { 
      result = ShowThreadExceptionDialog(t.Exception); 
     } 
     catch 
     { 
      try 
      { 
       MessageBox.Show("Fatal Error", "Application Error", MessageBoxButtons.OK, MessageBoxIcon.Stop); 
      } 
      finally 
      { 
       Application.Exit(); 
      } 
     } 

     // Exits the program when the user clicks Abort. 
     if (result == DialogResult.Abort) 
      Application.Exit(); 
    } 

    // Creates the error message and displays it. 
    private static DialogResult ShowThreadExceptionDialog(Exception e) 
    { 
     string errorMsg = "An error occurred please contact the adminstrator with the following information:\n\n"; 
     errorMsg = errorMsg + e.Message + "\n\nStack Trace:\n" + e.StackTrace; 
     return MessageBox.Show(errorMsg, "Application Error", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Stop); 
    } 
} 

取自以下事件:

AppDomain.CurrentDomain.UnhandledException 
Application.ThreadException 

在這些處理程序中,您可以顯示您製作的自定義表單。

2

這是ThreadExceptionDialog類,它派生自Form類。從它導出來改變對話框是一個失敗的原因,你不能輕易地進入嵌入式控件。您可以創建自己的Form派生類來創建自己的對話框,只需給它一個帶有Exception參數的構造函數即可。爲Application.ThreadException實現一個事件處理程序來顯示它。

請注意對話框中的根本缺陷。它希望用戶在需要點擊按鈕來解除對話時做出正確的選擇。一般來說,關於究竟發生了什麼問題的信息相當模糊。這對你來說意味着什麼,對用戶來說,很少有什麼比'哦廢話'更重要。點擊繼續按鈕通常不是正確的做法。

爲了避免用戶做出這樣困難的選擇,請在您的Main()方法中調用Application.SetUnhandledExceptionMode(),傳遞ThrowException,以避免引發事件。每個未處理的異常現在都會經過AppDomain.UnhandledException。包括在工作線程中產生的那些線程,例外情況是不會產生對話框。爲它編寫一個事件處理程序,並顯示和/或記錄e.ExceptionObject.ToString()的值。您可以自行決定如何將該信息提供給您的辦公桌或用戶的IT人員,以便您改進產品並使其機器穩定。

0

檢查this鏈接。

從頁面:

介紹

一個讓我印象深刻,當我第一次開始學習.NET是其增強的異常處理功能的東西。我的意思是這樣的功能,如輕鬆訪問拋出的異常類型,完整的堆棧跟蹤和內部異常。這使得在那些剛抓到頂級System.Exception的地方仍然可以獲得完整的信息。我覺得這很方便,因爲如果你不需要對特定類型的異常採取特定的操作,那麼對於可能拋出的每種類型的異常都有連續的catch處理程序是很繁瑣的。無論如何,即使你確實捕獲了特定的異常,你通常也需要捕獲System.Exception來掩蓋自己並防止程序崩潰。因此,我發現我最終在我的代碼中捕獲了System.Exception。一個典型的情況是,在Windows窗體和ASP.NET Web窗體應用程序中,所有不重要的事件處理程序最終都包含try-catch System.Exception塊。

麻煩的是,這樣做還是有點凌亂的代碼,並沒有真正似乎很正確。有沒有更好的辦法?