【问题标题】:Catch unhandled exception, still shows “program stopped working” dialog捕获未处理的异常,仍然显示“程序停止工作”对话框
【发布时间】:2016-02-28 02:57:36
【问题描述】:

我读过in this post,为了避免“程序停止工作”对话框,我需要从 AppDomain 捕获未处理的异常。

 public Form1()
 {
  ///Code
   AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
  ///more code
 }

     void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        var excep = e.ExceptionObject;

        //Writing the exception to log file with the stack flow
        Logger.Logger.LogException("UNHANDLED EXCEPTION:"+Environment.NewLine +excep.ToString(), this);

        //Terminate the logger (manual event waiting for file write to finish)
        Logger.Logger.Terminate();
        Environment.Exit(1);
    }

但是当我被吸入异常时。我可以看到它写在日志上,但应用程序显示“程序停止工作”对话框。 可能是由Logger.Terminate 行引起的吗? (再次 - 终止命令等待,直到所有日志都写入日志文件)

【问题讨论】:

  • 您的事件处理程序也可能崩溃。 Terminate() 方法听起来很冒险。即使 Environment.Exit() 可能会失败,它仍然会运行终结器。或者像 Logger 类中的错误之类的愚蠢的东西,当您在事件处理程序中使用它时不会变得更好。通常,您的程序中发生了一些令人讨厌的事情,因此它也可能破坏您的事件处理程序的可能性永远不会为零。您订阅该事件的时间也相当晚,应该在执行其他任何操作之前在 Main() 方法中完成。
  • 事件处理程序也有可能永远不会被调用。一些异常 (StackOverflowException) 可以在任何处理程序有机会运行之前取消整个进程。
  • Guys- 我在日志文件中看到了 unhandle 异常,并且还在完成日志文件。所以这个事件确实得到处理。此外,我确实在线程异常中捕获了相同的事件(谢谢!)

标签: c# winforms exception unhandled-exception


【解决方案1】:

理想情况下,您希望避免出现“程序停止工作”对话框,因为您希望从一开始就避免出现“程序停止工作”的情况。如果没有,如果你只是想记录错误并让程序优雅地结束,那么程序实际上必须优雅地结束。

如果您使用Environment.Exit(1) 退出程序,您几乎是在告诉操作系统,“嘿,我退出了!”,这与优雅终止相反。尝试使用 0 代码退出,看看是否有任何不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 2017-07-22
    • 1970-01-01
    • 2011-12-02
    • 2013-12-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多