从异常处理程序中获取ExitCode

本文关键字:ExitCode 获取 异常处理程序 | 更新日期: 2023-09-27 18:11:22

我的控制台应用程序中有以下错误处理程序

主要过程:

AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(ErrorHandler);

处理过程:

static void ErrorHandler(object sender, UnhandledExceptionEventArgs args)
        {
            Exception e = (Exception)args.ExceptionObject;
            ... Loging Error ...
            //Environment.Exit(?);
        }

问题是错误被记录,但应用程序失败后,窗口弹出(应用程序没有响应)显示。

所以我想添加Environment.Exit()来防止这种行为,但是如何从异常中指定exitCode ?我不想设置退出(0)(这意味着一切都是好的),因为我也想看到错误(只有一些错误发生的信息,异常已经被记录)在调度程序应用程序触发这个脚本。

Thank you

从异常处理程序中获取ExitCode

大多数程序员只是使用Environment.Exit(1)。几乎总是工作得很好。但这在技术上是不正确的,如果一个程序因异常而死亡,那么它的退出码通常是与底层异常错误码相同。事件处理程序不应该改变这种行为。

做对了是很困难的:

   Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(e));

这里有一个FUD因素,您不能完全信任带有不设置错误代码的自定义异常对象的库。仍然可以,回退是E_FAIL

可以使用Exception.HResult吗?

考虑以下代码:

class Program
{
    static int Main(string[] args)
    {
        AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; ;
        if (args.Any() && args[0] == "/t")
        {
            Console.WriteLine("I am going to throw an exception");
            throw new ApplicationException("This is an exception");
        }
        else
        {
            Console.WriteLine("I am going to exit");
            //Environment.Exit(0);
            return 0;
        }
    }
    private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("An unexpected error has occurred");
        Exception ex = (Exception)e.ExceptionObject;
        Environment.Exit(ex.HResult);
    }
}

然后在批处理文件中执行两次-一次带/t参数,另一次不带:

@echo off
cls
echo Running Console Application with no error
ConsoleApplication2.exe
echo %errorlevel%
echo Running Console Application with error
ConsoleApplication2.exe /t
echo %errorlevel%
pause

在第一次运行中,您以0退出。我已经让Main返回一个int值,并且在成功执行时只返回0 -你可以在这里执行Environment.Exit(0)。

第二次运行抛出ApplicationException, UnhandledException被处理,然后Environment.Exit(ex.HResult)被调用。

我认为HResult与MSDN中的特定异常有关。但是,根据导致异常的原因,您可能需要不同的退出代码。在这种情况下,您可以抛出自定义异常,然后在UnhandledException处理程序中添加一些模糊逻辑:

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine("An unexpected error has occurred");
        Exception ex = (Exception)e.ExceptionObject;
        if (ex is MyException)
        {
            Environment.Exit(10009); // my own exit codes
        }
        Environment.Exit(ex.HResult);
    }
}
class MyException : Exception
{
}

但是你真的会关心为什么它在主机上失败吗?如果你得到一个未处理的异常,那么它就失败了。你可能有很多可能的故障点。你要怎么处理这个错误代码呢?您已将异常注销。