如何退出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块。我觉得奇怪的是,在这样的问题中没有提到这个问题。

如何退出AppDomain.CurrentDomain.UnhandledException处理程序中的应用程序,并仍然

你不会得到这个。Environment.Exit()确保终结器仍在运行,这可能是回退。但不是为了清理临时文件,请使用操作系统对此的支持,并使用FileOptions.DeleteOnClose选项。

一般来说,你永远不应该依赖于清理的硬性要求,当CLR用SOE或FEEE轰炸时,任何东西都不会被清理,用户从任务管理器终止你的应用程序,硬重新启动机器或电源关闭。