簡體   English   中英

抑制未處理的異常對話框?

[英]Suppress unhandled exception dialog?

我正在處理代碼中所有未處理的異常,但是每當發生異常時(不是在調試期間),我都會收到錯誤窗口,一旦關閉,就會彈出“您的應用程序中發生未處理的應用程序異常”窗口。 我如何壓制它?

PS:我沒有使用ASP.NET ,我使用的是Windows Forms

AppDomain.UnhandledException 發生了一件非常令人討厭的事情,您程序中的一個線程因心臟病發作而死亡。 程序繼續以有意義的方式運行的可能性為零,.NET 通過終止程序來結束這種痛苦。

AppDomain.CurrentDomain.UnhandledException事件編寫一個事件處理程序並記錄或顯示e.ExceptionObject.ToString()的值,以便您知道是什么導致了事故。 這為您提供了如何修復代碼的提示。 如果有的話,這很可能是您自己無法修復的。 例如某種數據庫服務器故障。 因此,故意隱藏錯誤是一個非常糟糕的主意。 您客戶的支持人員將不知道該怎么做。

對於 Windows 窗體,您可以在調用Application.Run()方法之前,通過在Main()方法中添加以下內容,將未處理的異常(否則會導致未處理的異常窗口彈出)發送到異常處理程序:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

您可以通過將以下內容添加到表單的構造函數或其他地方,為您的處理程序訂閱未處理的異常事件:

Application.ThreadException += myHandler;

您的表單的處理程序方法如下所示:

void myHandler(object sender, System.Threading.ThreadExceptionEventArgs e)
{
     //do something
}

您可以在msdn上找到有關此內容的更多信息。

這是顯示所有未處理異常的解決方案,包括托管和非托管類型:

static void Main() {
    try {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
        Application.ThreadException += 
            new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
        Application.Run(new Form1());
    }
    catch (Exception ex) {
        MessageBox.Show("A fatal error has occurred.  Please contact your admin\n" +
                        "Exception type: " + ex.GetType() + "\n" +
                        "Exception Message: " + ex.Message + "\n" +
                        ex.StackTrace, "Fatal Exception");
        if (ex.InnerException != null) {
            MessageBox.Show("Inner Exception:\n" +
                            "Exception type: " + ex.InnerException.GetType() + "\n" +
                            "Exception Message: " + ex.InnerException.Message + "\n" +
                            ex.StackTrace, "Fatal Exception (inner)");
        }
    }
}

static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) {
    throw new Exception(e.Exception.Message, e.Exception);
}

為了測試這一點,我使用 C++/CLI 拋出了一個非托管異常。 除非存在上述 Application_ThreadException 處理程序,否則這些不會被正確捕獲。

我會使用異常屏蔽。

Windows 應用程序示例

這一個顯示了對服務的使用

異常屏蔽

它是企業庫的一部分,允許您過濾掉異常並重新映射它們,以隱藏詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM