Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么以及如何在环境中使用Windows系统错误代码。退出_C#_.net_Windows_Error Handling - Fatal编程技术网

C# 为什么以及如何在环境中使用Windows系统错误代码。退出

C# 为什么以及如何在环境中使用Windows系统错误代码。退出,c#,.net,windows,error-handling,C#,.net,Windows,Error Handling,相关(但不同): 我的C#console应用程序正在一种文件类型和另一种文件类型之间进行转换(为了方便起见,我们将它们称为*.x和*.y);用户必须将两个文件的完整路径指定为命令行参数 通常情况下,我有相当多的逻辑来验证命令行参数。每当出现验证错误时(显然,在向用户打印出适当的消息之后),我都会在应用程序中使用 微软有大量的错误代码。与我最直接相关的是0(进程成功运行)和1(未找到文件) 我的命令行参数的错误案例/验证规则如下: 用户提供的命令行参数太多(超过2个)。这意味着用户必须包含不相关

相关(但不同):

我的C#console应用程序正在一种文件类型和另一种文件类型之间进行转换(为了方便起见,我们将它们称为
*.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很好,我可以看出这在这些情况下是多么有用。你的评论实际上可能就是答案。谢谢,这很有道理。