【问题标题】:try/catch all exception in C#尝试/捕获 C# 中的所有异常
【发布时间】:2010-07-10 08:22:08
【问题描述】:

我想用 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");
}

但它允许一些异常通过。

【问题讨论】:

  • 使用这样的方法,有一个极端情况是您的应用程序在启动时出现异常而崩溃,然后重新启动只是再次崩溃。用户的应用程序会非常快速地重新启动,即使使用任务管理器也很难杀死。这对大多数用户来说都是个问题。您可能希望使用某种计数器机制来防止这种情况发生,尽管这当然可能会再次引发异常。对于该机制,如果发生任何异常,则抛出特定异常,该异常不会由重新启动应用程序的异常处理程序处理。
  • @FrederikB:感谢您指出这个设计缺陷。

标签: c# exception message-pump


【解决方案1】:

您可以将此代码放在您的 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. 将 Application.Run() 放入 try-catch 块中
    2. 使用 Application.ThreadException 事件
    3. 使用 AppDomain.UnhandledException 事件
    4. 添加注册表项以弹出JIT Debugger
    5. 在安装了调试符号的崩溃模式下使用 ADPLUS。

    Getting Better Information on Unhandled Exceptions

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 是的,但我可以捕获异常,确保应用程序不会向用户显示它们吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 2011-12-05
      • 2014-05-11
      • 2011-07-23
      相关资源
      最近更新 更多