你可以使用 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
{
}
但你真的会关心它为什么在控制台中失败吗?如果你得到一个未处理的异常,那么它就失败了。您可能有很多可能的故障点。你真的要对错误代码做什么?您已将异常注销。这提供了重要信息。