【发布时间】:2009-10-08 16:18:14
【问题描述】:
是否有一套标准的应用程序返回码?诸如返回 0 表示成功 1 表示失败,然后以此类推?
我有一个 Windows Server 应用程序,我正在添加一些返回错误代码,除了我需要的应用程序特定代码之外,我还希望坚持使用标准代码。
【问题讨论】:
是否有一套标准的应用程序返回码?诸如返回 0 表示成功 1 表示失败,然后以此类推?
我有一个 Windows Server 应用程序,我正在添加一些返回错误代码,除了我需要的应用程序特定代码之外,我还希望坚持使用标准代码。
【问题讨论】:
我认为唯一的标准是 0 表示成功,非 0 表示失败。这更像是一种约定,而不是一种标准。
【讨论】:
也许您可以采用一些 Unix 约定。
在another answer,用户大卫建议
sysexits.h有一个标准退出代码列表。它似乎至少可以追溯到 1993 年,一些像 Postfix 这样的大项目使用它,所以我想这是要走的路。来自 OpenBSD 手册页:
根据 style(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 中可以找到这些错误代码的更详细描述。
【讨论】:
标准状态码是EXIT_SUCCESS和EXIT_FAILURE,定义在stdlib.h中。不过,几乎每个人都分别使用 0 和 1。有些软件会针对不同类型的错误使用不同的非零代码。
【讨论】:
没有应用程序应该遵守的标准退出代码集。
但是,正如您提到的,有一些常见的值,例如 0 表示成功。根据您使用的操作系统和工具,您或许可以查看类似应用的退出代码并模仿它们。
【讨论】:
唯一真正的约定是0 表示成功,非零值(通常为1)表示失败。有关这方面的官方参考,例如,请参阅exit 上的 Microsoft C++ 文档:
通常,调用者将
status值设置为 0 表示正常退出,或设置为其他值表示错误。
或者 Envrionment.Exit 和 Environment.ExitCode 上的 C# 文档有不同的状态:
使用 0(零)表示过程成功完成。
和
默认值为0(零),表示进程成功完成。
和
使用非零数字表示错误。在您的应用程序中,您可以在枚举中定义自己的错误代码,并根据场景返回相应的错误代码。例如,返回值 1 表示所需文件不存在,返回值 2 表示文件格式错误。有关 Windows 操作系统使用的退出代码列表,请参阅 Windows 文档中的 System Error Codes。
与some other answerers 不同,我强烈建议不要将系统错误代码用作应用程序退出代码。关于系统错误代码的一些说明:
dir、dotnet 或TAEF。李>
【讨论】:
退出代码远非标准,更多地用于开发人员了解应用程序返回时发生的相应错误。 0 表示成功,非 0 表示失败的标准是大势所趋,使用它是因为它允许您对所有可能的错误使用完整的非零范围。
如果您的应用程序正确记录错误,退出代码可能完全不需要跟踪。
【讨论】:
【讨论】:
FormatMessage() 或 C# var ex = new Win32Exception(code); Console.WriteLine(ex.Message); 检索有意义的字符串。请注意,ERROR_SUCCESS 定义为 0,因此此枚举与直接使用 AND/OR 逻辑测试退出代码的批次兼容。 stackoverflow.com/a/17085933/420400
实现你将使用的东西。其他的都是多余的。
【讨论】: