捕获未处理的异常,仍显示“程序停止工作”对话框。

5

我在这篇文章中读到,为了避免“程序停止工作”对话框的出现,我需要从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命令会等待所有日志写入日志文件后才终止)


1
你的事件处理程序也有可能崩溃。Terminate()方法听起来相当危险。即使Environment.Exit()失败了,它仍然会运行终结器。或者像Logger类中的一个愚蠢的错误,在事件处理程序中使用它也不会得到改善。一般来说,你的程序发生了一些不好的事情,所以它可能会不稳定,甚至会影响到事件处理程序,这种情况永远不是零。你订阅事件的时间也相当晚,应该在Main()方法中做任何其他操作之前完成。 - Hans Passant
事件处理程序可能永远不会被调用。某些异常(例如StackOverflowException)可能会在任何处理程序有机会运行之前使整个进程崩溃。 - user743382
大家好-我在日志文件中看到未处理的异常,也看到了日志文件的完成。因此,这个事件确实得到了处理。此外,在主线程中,我也捕获了相同的线程异常事件(感谢!) - Izikon
1个回答

0
理想情况下,您应该避免出现“程序停止工作”对话框,因为您希望避免程序停止工作的情况。如果不是这样,如果您只想记录错误并让程序正常结束,则程序必须真正优雅地结束。
如果您使用 Environment.Exit(1) 退出程序,基本上就是告诉操作系统,“嘿,我挂了!”,这与优雅终止相反。尝试使用0代码退出并查看是否有任何区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接