C# 为什么以及如何在环境中使用Windows系统错误代码。退出
相关(但不同): 我的C#console应用程序正在一种文件类型和另一种文件类型之间进行转换(为了方便起见,我们将它们称为C# 为什么以及如何在环境中使用Windows系统错误代码。退出,c#,.net,windows,error-handling,C#,.net,Windows,Error Handling,相关(但不同): 我的C#console应用程序正在一种文件类型和另一种文件类型之间进行转换(为了方便起见,我们将它们称为*.x和*.y);用户必须将两个文件的完整路径指定为命令行参数 通常情况下,我有相当多的逻辑来验证命令行参数。每当出现验证错误时(显然,在向用户打印出适当的消息之后),我都会在应用程序中使用 微软有大量的错误代码。与我最直接相关的是0(进程成功运行)和1(未找到文件) 我的命令行参数的错误案例/验证规则如下: 用户提供的命令行参数太多(超过2个)。这意味着用户必须包含不相关
*.x
和*.y
);用户必须将两个文件的完整路径指定为命令行参数
通常情况下,我有相当多的逻辑来验证命令行参数。每当出现验证错误时(显然,在向用户打印出适当的消息之后),我都会在应用程序中使用
微软有大量的错误代码。与我最直接相关的是0
(进程成功运行)和1
(未找到文件)
我的命令行参数的错误案例/验证规则如下:
- 用户提供的命令行参数太多(超过2个)。这意味着用户必须包含不相关的参数
- 用户提供的命令行参数太少(少于两个)。这意味着用户没有提供这两个文件的路径
- 一个或多个参数具有无法识别的文件类型(即除
或*.x
之外的其他文件类型)*.y
- 用户没有同时提供
文件和*.x
文件*.y
- 用户提供的路径中不存在一个或两个文件。在这种情况下,我假设正确的调用是
Environment.Exit(1)代码>(因为这是Microsoft的文档所说的,正确的错误代码适用于未找到的文件)
Environment.Exit(1)中获得了什么代码>(例如)?我确实从文档中意识到,它会将我指定的错误代码返回到操作系统,但这实际上对我有什么帮助(特别是从编写没有“低级”操作的“纯”.NET”应用程序的角度来看)?在这一点上,操作系统实际上做了什么不同的事情,它对用户(或我自己的调试)有什么好处
我是否必须在我的应用程序中执行任何“特殊”操作才能从中获得最大的好处?退出代码可以被任何其他生成应用程序的进程使用。例如,有时您希望从C#应用程序调用外部工具(例如ffmpeg
)。您正在做的事情类似于:
var ffmpeg = new Process();
ffmpeg.StartInfo = new ProcessStartInfo("ffmpeg.exe", "args");
ffmpeg.Start();
ffmpeg.WaitForExit();
这样做之后,你想知道一切是否顺利。程序很难分析错误输出或类似的内容,因此您只需检查:
bool allFine = ffmpeg.ExitCode == 0;
因为一般惯例(在我所知道的所有操作系统中)是返回0表示成功)。诚然,它并不总是有效的,但这是因为并非所有工具都遵循这个有用的约定,即成功返回0,错误返回1,所以您应该站在好的一边并遵循这一点
当你的应用程序运行在长.BAT脚本的中间时,同样是正确的。作者希望根据执行结果执行某些动作。
简而言之,您的错误消息是供人使用的,而退出代码是供机器使用的。因此,成功时返回0,错误时返回任何其他值(通常为1)。如果您的程序是为广泛的命令行使用而设计的,并且与其他工具(如许多unix工具)结合使用,那么您可能希望针对不同的条件使用多个退出代码并对其进行记录,但这里的情况并非如此。您不需要使用环境。退出
-只需更改Main
的签名即可返回int:
static int Main(string[] args) {...}
另外,您不能从main方法返回int吗?不知道您是否需要/应该使用Environment.Exit-我认为这更像是一个“杀死进程并返回一个数字”@Derek是的,我想我也可以这样做。使用0表示成功,使用其他任何表示错误。当一个进程生成另一个进程并希望检查是否一切正常时,这一点很重要。例如,如果您在C#中生成流程并调用WaitForExit
——您想知道是否一切正常。当您在某些脚本(.bat文件)中调用该程序,并且在某些步骤(调用您的应用程序)失败时不想继续使用脚本时,同样适用于此。@Evk很好,我可以看出这在这些情况下是多么有用。你的评论实际上可能就是答案。谢谢,这很有道理。