【发布时间】: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