当未处理的异常终止执行时的退出代码?

16

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

我无法找到相关文档。一个简单的控制台应用程序执行throw new Exception() ,将以退出代码255死亡。我想知道是否可以安全地假定所有未处理的异常都将返回相同的错误代码,还是需要注意不同情况下的变化/特例。

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

3
ECMA-335中没有找到相关内容,因此我猜测在未处理异常的情况下,运行时的退出码并没有标准化。 - Gene
3
对于我在Windows 10.0.14393上的情况,“ECHO %ERRORLEVEL%”输出“-532462766”。 - binki
1个回答

13
不一定。255是一个Unix数字,通常通过使用-1退出产生,不清楚您如何看到它。在Windows上,.NET进程通常以SEH异常代码值退出,该代码值使进程崩溃并终止。通常为-532462766(又名0xE0434352)表示托管异常的最后3个十六进制数对拼写为“CCR”,这是一个在corexcep.h中声明为EXCEPTION_COMPLUS的首字母缩写词,其含义已经模糊不清。一个示例问题在这里
良好的程序会订阅AppDomain.CurrentDomain.UnhandledException,并在调用Environment.Exit()时提供更好的退出代码,就像Marshal.GetHRForException()所生成的代码一样。您将获得与托管异常类型匹配的退出代码,标准异常类型的值记录在CorError.h SDK文件中。
 echo %errorlevel%

以前的问题中没有看到这一点。 %errorlevel% 只能有0到255之间的值,这限制可以追溯到 MS-Dos 时代。由于 SEH 异常代码总是更大,因此通常会看到 255。使用 %errorlevel% 的唯一合理方式是在它不为0时假定程序失败。除非您得到了程序作者的具体文档。


4
似乎限制在某个时候被解除了,因为在Windows 10.0.14393中,对于“ECHO %ERRORLEVEL%”,我得到了“-532462766”的结果。 - binki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接