Windows 什么;标准;应用程序是否应支持应用程序返回/退出代码?

Windows 什么;标准;应用程序是否应支持应用程序返回/退出代码?,windows,standards,Windows,Standards,是否有一套标准的应用程序返回代码?返回0表示成功,返回1表示失败,等等 我有一个Windows Server应用程序,我正在添加一些返回错误代码,除了我需要的特定于应用程序的代码外,我还希望坚持使用标准代码。我认为唯一的标准是0表示成功,非零表示失败。这与其说是标准,不如说是惯例。没有一套标准的退出代码是应用程序应该遵守的 但是,正如您所提到的,对于成功来说,有一些常见的方法,如0。根据您使用的操作系统和工具,您可能可以查看类似应用程序的退出代码并模仿它们。退出代码远不是标准代码,开发人员更多地

是否有一套标准的应用程序返回代码?返回0表示成功,返回1表示失败,等等


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

我认为唯一的标准是0表示成功,非零表示失败。这与其说是标准,不如说是惯例。

没有一套标准的退出代码是应用程序应该遵守的


但是,正如您所提到的,对于成功来说,有一些常见的方法,如0。根据您使用的操作系统和工具,您可能可以查看类似应用程序的退出代码并模仿它们。

退出代码远不是标准代码,开发人员更多地使用退出代码来了解应用程序返回时发生的相应错误。成功的标准是0,失败的标准是非零,这是一个普遍趋势,因为它允许您对所有可能的错误使用完整的非零范围


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

标准状态代码是
exit\u SUCCESS
exit\u FAILURE
,在
stdlib.h
中定义。不过,几乎每个人都只分别使用0和1。有些软件会对不同类型的错误使用不同的非零代码。

实现您要使用的功能。其他任何东西都是多余的。

也许您可以采用一些Unix约定

在中,用户David建议

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 */

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

肯定有为Windows定义的标准错误代码

很久以前,我们对特定的“自定义”错误使用负面错误,但我怀疑这是一种好的做法


唯一真正的惯例是
0
表示成功,非零值(通常
1
)表示失败。有关这方面的官方参考,例如,微软上的C++文档: 通常,调用者将
status
值设置为0表示正常退出,或设置为其他值表示错误

或者C#docs上的和不同的状态:

使用0(零)表示进程已成功完成

默认值为0(零),表示进程已成功完成

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

与此不同,我强烈建议不要将系统错误代码用作应用程序退出代码。有关系统错误代码的一些注意事项:

  • Microsoft不建议在任何地方使用它们作为应用程序退出代码,实际上,在我上面引用的文档中明确建议您“定义自己的错误代码”
  • Microsoft在其自己的应用程序或命令中不一致地使用它们作为退出代码。虽然有一些应用程序确实使用了这些代码,例如,但还有很多应用程序不使用这些代码,例如
    dir
    dotnet
    ,或
  • 对我来说,使用它们显然是个坏主意。有数千个系统退出代码,其中大多数与您的特定应用程序无关。如果您尝试使用它们,您将浪费大量时间在列表中挑选适用于您的场景的代码,最终结果对于调用您的应用程序的开发人员来说将不如您刚刚定义了一小部分对您的特定应用程序有意义的退出代码那么有用,因此请改为这样做

您无需将系统错误代码用作程序退出代码。正如在这里的其他答案中所指出的,Windows程序通常使用1作为捕获所有错误代码;如果每个人都在使用系统错误代码,那就永远意味着“功能不正确”(根本没有办法指出一个通用的未指定错误)。没错,你不需要遵守标准。问题是关于标准,这就是我提供的。基本情况为零表示成功,非零表示失败。如果调用者无法处理特定的故障,您不会关心错误是什么,但是如果您希望调用者处理故障,那么最好给出有意义的错误。在这种情况下,标准有助于给出结构。“你不需要遵守标准”-这是一个非序列;使用系统错误代码作为应用程序退出代码对“遵守标准”没有任何作用,因为在任何地方都没有标准建议这样做。“如果你希望呼叫者对故障采取行动,给出有意义的错误是一个很好的做法”——我同意,但是这是很难通过使用系统错误代码来实现的,因为有成千上万个代码(所以呼叫者不可能把它们都考虑在内),而且它们很有可能。