1

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

但它允许一些例外通过。

4

3 回答 3

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) (我记得)。

于 2010-07-10T08:34:40.337 回答
2

Peter Bromberg 有一篇很好的文章,介绍了处理未处理异常的各种方法。他描述了以下方法:

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

获取有关未处理异常的更好信息

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

于 2010-07-10T11:28:05.810 回答
1

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

于 2010-07-10T08:25:17.867 回答