C# 从异常处理程序获取ExitCode

C# 从异常处理程序获取ExitCode,c#,exception,exit-code,C#,Exception,Exit Code,我的控制台应用程序中有以下错误处理程序 主程序: AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(ErrorHandler); static void ErrorHandler(object sender, UnhandledExceptionEventArgs args) { Exception e = (E

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

主程序:

AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(ErrorHandler);
static void ErrorHandler(object sender, UnhandledExceptionEventArgs args)
        {
            Exception e = (Exception)args.ExceptionObject;
            ... Loging Error ...
            //Environment.Exit(?);
        }
处理程序过程:

AppDomain.CurrentDomain.UnhandledException +=
                new UnhandledExceptionEventHandler(ErrorHandler);
static void ErrorHandler(object sender, UnhandledExceptionEventArgs args)
        {
            Exception e = (Exception)args.ExceptionObject;
            ... Loging Error ...
            //Environment.Exit(?);
        }
问题是错误会被记录下来,但在应用程序失败之后,会显示windows弹出窗口(应用程序没有响应)

所以我想添加Environment.Exit()来防止这种行为,但是如何从异常中指定exitCode呢?我不想设置退出(0)(这意味着一切正常),因为我还想在触发此脚本的调度程序应用程序中查看错误(仅显示发生了某些错误的信息,异常已记录)


谢谢大多数程序员只是简单地使用环境。退出(1)。几乎总是工作得很好。但这在技术上是不正确的,如果程序因异常而死亡,那么其退出代码通常与底层异常错误代码相同。事件处理程序不应更改该行为

正确地做这件事是非常重要的:

   Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(e));
这里有一个FUD因素,你不能完全信任一个带有自定义异常对象的库,因为它没有设置错误代码。仍然可以,回退是E_FAIL。

您可以使用异常吗

考虑以下代码:

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的第二次运行中,将处理未处理的Exception,然后调用Environment.Exit(ex.HResult)

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

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
{

}

但是你真的关心为什么它在控制台中失败吗?如果您得到一个未处理的异常,那么它将失败。你可能有很多可能的失败点。你真的打算怎么处理错误代码?您已注销该异常。这提供了重要的信息。

请看是否有帮助谢谢,我不会使用有关特定ExitCode的信息,但我希望它正确无误,并且在将来会有用。尽管如此,我还是发现应用程序正在崩溃,但这并不是什么大问题,因为它正在进行日志记录:-)