应用程序支持哪些"标准"应用程序返回/退出代码?

Mik*_*keD 11 windows standards

是否有标准的应用程序返回代码集?比如返回0表示成功1表示失败,然后等等?

我有一个Windows Server应用程序,我正在添加一些返回错误代码,并希望坚持标准代码,除了我将需要的应用程序特定的代码.

Dou*_*der 16

我认为唯一的标准是0表示成功,非零表示失败.这更像是一种惯例,而不是一种标准.

  • 啊。这不是一个约定,它实际上是确定脚本是否失败或函数是否失败的机制......在脚本中设置 -o errexit 并使用非零退出代码调用某些内容,它会中断你的调用脚本。这不是一些“人们倾向于遵循的约定”,这就是 POSIX shell 几十年来的运作方式。 (2认同)
  • 我想我可以添加“在 Windows 上”,因为 Posix 是一个标准,你有 Posix 定义 0 为成功的参考吗? (2认同)

gio*_*ele 8

也许你可以采用一些Unix约定.

另一个答案中,用户大卫建议

sysexits.h有一个标准退出代码列表.它似乎可以追溯到至少1993年和一些像Postfix这样的大项目使用它,所以我想它是要走的路.

从OpenBSD手册页:

根据样式(9),在结束程序时,使用任意值调用exit(3)来指示失败条件并不是一个好习惯.相反,应该使用来自sysexits的预定义退出代码,因此进程的调用者可以在不查找源代码的情况下粗略估计失败类.

这是Debian系统上出现的列表:

#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */
Run Code Online (Sandbox Code Playgroud)

在文件内部/usr/include/sysexits.h可以找到这些错误代码的更详细描述.


Mar*_*ery 7

唯一真正的约定是这0意味着成功,非零值(通常1)意味着失败。有关这方面的官方参考,例如,请参阅 Microsoft 的 C++ 文档exit

通常,调用者将该status值设置为 0 以指示正常退出,或设置为某个其他值以指示错误。

或者 C# docs on Envrionment.Exitand Environment.ExitCodewhich different states:

使用 0(零)表示该过程成功完成。

默认值为 0(零),表示该过程成功完成。

使用非零数字表示错误。在您的应用程序中,您可以在枚举中定义自己的错误代码,并根据场景返回相应的错误代码。例如,返回值 1 表示所需文件不存在,返回值 2 表示文件格式错误。有关 Windows 操作系统使用的退出代码列表,请参阅Windows 文档中的系统错误代码

其他一些回答者不同,我强烈建议不要使用系统错误代码作为应用程序退出代码。关于系统错误代码的一些注意事项:

  • Microsoft不建议在任何地方将它们用作应用程序退出代码,并且确实明确建议您在我上面引用的文档中“定义自己的错误代码”
  • Microsoft 不会在他们自己的应用程序或命令中始终将它们用作退出代码。虽然有一些应用的一些例子使用这些代码,比如msiexec.exe的,有很多更不一样dirdotnet塔伊夫
  • 使用它们对我来说似乎是一个明显的坏主意。有数以千计系统退出代码,其中大部分与您的特定应用程序无关。如果您尝试使用它们,您将浪费时间在列表中挑选适用于您的场景的代码,并且最终结果对于调用您的应用程序的开发人员来说比您刚刚定义一个小数字更没用对您的特定应用程序有意义的退出代码 - 而是这样做。


Lau*_*ves 6

标准状态代码是EXIT_SUCCESSEXIT_FAILURE定义的stdlib.h.然而,几乎所有人都分别使用0和1.某些软件将针对不同类型的错误使用不同的非零代码.


Dav*_*vid 5

应用程序不应该遵循标准的退出代码集。

但是,您提到过一些成功的常见问题,例如0。根据所使用的操作系统和工具,您可以查看类似应用程序的退出代码并进行模仿。

  • @Lurkers:尽管这是一个 Windows 问题,但我发现重要的是要指出,虽然没有硬标准(例如 ISO 或 DIN),但某些操作系统确实存在约定。例如,这里是 Linux 的标准退出代码:http://tldp.org/LDP/abs/html/exitcodes.html (2认同)

Wil*_*ins 5

退出代码远非标准,更多地用于让开发人员了解应用程序返回时发生的相应错误。0 表示成功,非零表示失败的标准是总体趋势,之所以使用它,是因为它允许您对所有可能的错误使用完整的非零范围。

如果您的应用程序正确记录错误,则可能完全不需要跟踪退出代码。