[英]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 處理程序,否則這些不會被正確捕獲。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.