从异常处理程序获取 ExitCode
Getting ExitCode From Exception Handler
我的控制台应用程序中有以下错误处理程序
主要程序:
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)(这意味着一切正常),因为我还想在触发此脚本的调度程序应用程序中看到错误(只有发生错误的信息,异常已经记录)。
谢谢
大多数程序员只是使用 Environment.Exit(1)。几乎总是工作得很好。但这在技术上是不正确的,如果一个程序死于异常,那么它的退出代码通常 与底层异常错误代码相同。事件处理程序不应更改该行为。
做对是一口:
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(e));
这里有一个 FUD 因素,您不能完全信任具有未设置错误代码的自定义异常对象的库。还可以,回退是 E_FAIL.
你能使用异常吗?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 return 设置为 int 并且 return 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
{
}
但是你真的会关心它为什么在控制台中失败吗?如果你得到一个未处理的异常,那么它就失败了。您可能有很多可能的故障点。您真正打算如何处理错误代码?您已注销异常。这提供了重要信息。
我的控制台应用程序中有以下错误处理程序
主要程序:
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)(这意味着一切正常),因为我还想在触发此脚本的调度程序应用程序中看到错误(只有发生错误的信息,异常已经记录)。
谢谢
大多数程序员只是使用 Environment.Exit(1)。几乎总是工作得很好。但这在技术上是不正确的,如果一个程序死于异常,那么它的退出代码通常 与底层异常错误代码相同。事件处理程序不应更改该行为。
做对是一口:
Environment.Exit(System.Runtime.InteropServices.Marshal.GetHRForException(e));
这里有一个 FUD 因素,您不能完全信任具有未设置错误代码的自定义异常对象的库。还可以,回退是 E_FAIL.
你能使用异常吗?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 return 设置为 int 并且 return 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
{
}
但是你真的会关心它为什么在控制台中失败吗?如果你得到一个未处理的异常,那么它就失败了。您可能有很多可能的故障点。您真正打算如何处理错误代码?您已注销异常。这提供了重要信息。