从异常处理程序获取ExitCode

时间:2015-09-04 09:43:15

标签: c# exception exit-code

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

主要程序:

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?我不想设置Exit(0)(这意味着一切正常),因为我还希望在调度程序应用程序中看到错误(只有发生了一些错误的信息,异常已经记录)才会触发此脚本。

谢谢

2 个答案:

答案 0 :(得分:4)

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

正确行事是满口的:

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

这里有一个FUD因素,您无法完全信任具有不设置错误代码的自定义异常对象的库。还可以,后备是E_FAIL。

答案 1 :(得分:1)

您可以使用例外吗。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)。

我认为根据MSDN,HResult与特定异常相关联。但是,您可能需要不同的退出代码,具体取决于导致异常的原因。在这种情况下,您可以抛出自定义异常,然后在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
{

}

但你真的在乎它为什么在控制台失败了吗?如果你得到一个未处理的异常,那么它就失败了。您可能有很多可能的失败点。你真的要对错误代码做什么?您已将异常记录下来。这提供了至关重要的信息。