2010-04-04 73 views
2

我處理所有我unhanded異常的代碼,但每當一個反應(無法在調試過程中)我得到我的錯誤窗口,只要它關閉「未處理的應用程序異常發生在你的應用程序」窗口彈出。我如何壓制它?禁止未處理的異常對話?

PS:我不使用ASP.NET ,我使用Windows窗體

+0

我想你正在做一些類型的Windows應用程序的? – Nix 2010-04-04 16:34:37

+0

您可以通過固定被拋出異常到頂級代碼壓制它。 – 2010-04-04 16:35:09

+0

我可能不會注意到一些 – 2010-04-04 16:35:49

回答

4

您不能取消AppDomain.UnhandledException。一些真正令人討厭的事情發生了,你的程序中的一個線程因心臟病發作而死亡。該計劃將繼續以有意義的方式運行的機率是零,.NET終止程序杜絕了苦難。

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

0

對於Windows窗體,您可以發送未處理的異常(否則會導致未處理的異常窗口彈出)加入在Main()方法如下,以你的異常處理程序,被稱爲Application.Run()方法之前:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); 

您可以通過添加訂閱你的處理程序未處理的異常事件以下到窗體的構造函數或其它地方:

Application.ThreadException += myHandler; 

而且表單的處理方法是這樣的:

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

您可以找到有關這對msdn的更多信息。

0

這裏的顯示所有未處理的異常,託管和非託管類型的解決方案:

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處理程序,否則它們不會被正確捕獲。