尝试/捕获C#中的所有异常

时间:2010-07-10 08:22:09

标签: c# exception message-pump

我想在C#中的UI应用程序中捕获所有未处理的异常,以便我可以记录它们,通过邮件发送它们并重新启动应用程序。

我怎样才能完成这项工作?我试过了:

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 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:2)

Peter Bromberg有一篇关于处理未处理异常的各种方法的文章。 他描述了以下方法:

  1. 将Application.Run()放在try-catch块中
  2. 使用Application.ThreadException事件
  3. 使用AppDomain.UnhandledException事件
  4. 添加注册表项以弹出JIT Debugger
  5. 在安装了调试符号的崩溃模式下使用ADPLUS。
  6. Getting Better Information on Unhandled Exceptions

    关于我之前对该问题的评论:除非迫切需要重新启动崩溃的应用程序 - 我不会自动重启应用程序,因为你可能会陷入循环。如果你必须重新启动它,请向用户提供选择在重新启动之前重新启动应用程序。这样,如果它出错,用户可以保释。

答案 2 :(得分:1)

您需要订阅UnhandledException中的AppDomain个活动。见http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception(VS.71).aspx