如何退出AppDomain.CurrentDomain.UnhandledException处理程序中的应用程序,并仍然
本文关键字:程序 应用程序 处理 UnhandledException 何退出 退出 CurrentDomain AppDomain | 更新日期: 2023-09-27 18:29:48
每当发生异常时,我希望防止出现"应用程序已停止工作"弹出窗口。这样做的一种方法显然是在全局异常处理程序中调用Environment.Exit(1)
,即AppDomain.CurrentDomain.UnhandledException
,如下所示:
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
Exception exc = (Exception)e.ExceptionObject;
Console.Error.WriteLine("Exception:'n{0}", exc.Message);
Console.Error.WriteLine("Stack trace:'n{0}", exc.StackTrace);
Environment.Exit(1); // quit silently on exception, don't show the popup
}
然而,由于执行顺序的原因,上述代码导致finally
块不执行。这种行为的一个简单例子:
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
try
{
Console.WriteLine("try block");
throw new Exception("Somebody set us up the bomb.");
}
catch
{
Console.Error.WriteLine("catch block");
throw;
}
finally
{
Console.WriteLine("finally block");
}
异常处理程序中的Environment.Exit(1)
会在应用程序退出之前产生此输出(注意没有finally块):
try block
catch block
Exception:
Somebody set us up the bomb.
Stack trace:
at ...
当执行finally
块非常关键时,例如在清理try
内部创建的临时文件时,这可能会导致严重问题。
有没有一个简单的方法来解决这一切?也就是说,将全局异常处理程序、自定义异常输出等保留在其中,然后优雅地退出,但仍然可以执行finally
块。我觉得奇怪的是,在这样的问题中没有提到这个问题。
你不会得到这个。Environment.Exit()确保终结器仍在运行,这可能是回退。但不是为了清理临时文件,请使用操作系统对此的支持,并使用FileOptions.DeleteOnClose选项。
一般来说,你永远不应该依赖于清理的硬性要求,当CLR用SOE或FEEE轰炸时,任何东西都不会被清理,用户从任务管理器终止你的应用程序,硬重新启动机器或电源关闭。