2010-07-10 15 views
1

我想在我的用戶界面應用程序在C#中捕獲所有未處理的異常,以便我可以記錄它們,通過郵件發送並重新啓動應用程序。嘗試/捕獲在C#中的所有異常

我該如何簡單地完成這項工作?我試過:

try 
{ 
Application.EnableVisualStyles(); 
Application.SetCompatibleTextRenderingDefault(false); 
Application.Run(new MainDlg()); 
} 
catch (Exception e) 
{ 
Logger.Log(e); 
Logger.PostLog(); 
    System.Diagnostics.Process.Start("App.exe"); 
} 

但它讓一些例外通過。

+3

有了這樣的方法,有一個邊緣情況,你的應用程序在啓動時爆發異常,然後重新啓動,只能再次炸燬。用戶將擁有能夠快速重新啓動的應用程序,即使使用任務管理器也很難殺死。這對大多數用戶來說都會有問題。你可能想用某種反擊機制來防止這種情況,當然這可能會再次拋出異常。對於這種機制,如果發生任何異常,請拋出一個特殊異常,該異常不會由重新啓動應用程序的異常處理程序處理。 – Frederik 2010-07-10 09:01:01

+0

@FrederikB:謝謝你指出這個設計缺陷。 – apoorv020 2010-07-10 13:27:12

回答

3

你可以把這段代碼在你的Program.cs:

static void Application_ThreadException(object sender, 
     ThreadExceptionEventArgs e) //Generic error handler 
    { 
     MyApp.LogException(e.Exception); //Log exception 

     BugReport frmBugReport = new BugReport(); 
     frmBugReport.Error = e.Exception; 
     frmBugReport.ShowDialog(); 

     Environment.Exit(0); 
    } 

我展示我的應用程序的錯誤報告對話框。你可以使用Application.Restart()來填充Environment.Exit(0)(我記得)。

2

Peter Bromberg在處理未處理異常的各種方法上都有一篇很好的文章。 他介紹了以下方法:

  1. 在try-catch塊
  2. 把Application.Run()使用Application.ThreadException事件
  3. 使用AppDomain.UnhandledException事件
  4. 添加註冊表項,彈出JIT調試器
  5. 使用安裝了調試符號的崩潰模式下的ADPLUS。

Getting Better Information on Unhandled Exceptions

關於我早先對這個問題的評論:除非有迫切需要重啓崩潰的應用程序 - 我也不會自動重新啓動應用程序,因爲你可能會卡在循環如果您必須重新啓動它,在重新啓動之前向用戶提供重新啓動應用程序的選項。這樣,如果它一直出錯,用戶可以保釋。