【问题标题】:Exit Code When Unhandled Exception Terminates Execution?未处理的异常终止执行时退出代码?
【发布时间】:2016-05-19 13:43:24
【问题描述】:

当 C# .Net 控制台应用程序由于未处理的异常而终止时,是否有规则确定返回哪个退出代码或使用 255始终

我无法找到这方面的文档。一个执行throw new Exception() 的简单控制台应用程序因退出代码255 而死。我想知道是否可以安全地假设所有未处理的异常都将返回相同的错误代码,或者是否存在我需要注意的变化/极端情况.

C:\Temp\> ThrowsExceptionConsoleApp.exe
C:\Temp\> echo %errorlevel%
255

【问题讨论】:

  • ECMA-335中没有找到任何东西,所以我猜运行时的退出代码对于未处理异常的场景没有标准化。
  • 嗯,对我来说,在 Windows 10.0.14393 上,ECHO %ERRORLEVEL% 输出 -532462766

标签: c# .net exception console-application


【解决方案1】:

不,并非总是如此。 255 是一个 Unix 数字,通常以 -1 退出产生,不清楚你是如何看到它的。在 Windows 上,.NET 进程通常以 SEH 异常代码值退出,该值导致进程崩溃并终止。通常 -532462766(又名 0xE0434352)用于托管异常。最后 3 个十六进制对拼写为“CCR”,这是一个在时间的迷雾中失去意义的首字母缩写词,在 corexcep.h 中声明为 EXCEPTION_COMPLUS。示例问题is here

行为良好的程序订阅 AppDomain.CurrentDomain.UnhandledException 并在调用 Environment.Exit() 时提供更好的退出代码,就像 Marshal.GetHRForException() 产生的退出代码一样。您将获得与托管异常类型匹配的退出代码,标准异常类型的值记录在 CorError.h SDK 文件中。


 echo %errorlevel%

它在之前的问题中没有看到这一点。 %errorlevel% 只能有一个介于 0 和 255 之间的值,这个限制可以追溯到 MS-Dos 时代。由于 SEH 异常代码总是较大,您通常总是会看到 255。使用 %errorlevel% 的唯一明智方法是在它不为 0 时假设程序失败。除非您从程序作者那里获得特定文档。

【讨论】:

  • 似乎限制在某个时候被解除了,因为在 Windows 10.0.14393 中,我得到了 -532462766 for ECHO %ERRORLEVEL%
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-30
  • 2017-08-13
  • 1970-01-01
  • 2012-09-06
  • 1970-01-01
相关资源
最近更新 更多