c# - 为什么以及如何在Environment.Exit中使用Windows系统错误代码

标签 c# .net windows error-handling

相关(但不同):How do I look up the proper Windows System Error Code to use in my application?

我的C#控制台应用程序正在一种文件类型和另一种文件类型之间进行转换(为方便起见,我们将它们称为*.x*.y);用户必须指定两个文件的完整路径作为命令行参数。

通常,我有大量的逻辑可以验证命令行参数。每当出现验证错误时,我都会在应用程序中使用Environment.Exit(显然,在向用户打印了相应的消息之后)。

Microsoft具有非常广泛的错误代码list。与我最相关的是0(进程成功运行)和1(未找到文件)。

我的命令行参数的错误情况/验证规则如下:

  • 用户提供了太多的命令行参数(超过2个)。这意味着用户必须包含不相关的参数。
  • 用户提供的命令行参数太少(少于两个)。这意味着用户未提供两个文件的路径。
  • 一个或多个参数具有无法识别的文件类型(即*.x*.y以外的其他文件类型)。
  • 用户未同时提供*.x文件和*.y文件。
  • 用户提供的路径中不存在一个或两个文件。在这种情况下,我假设正确的调用是Environment.Exit(1);(因为这就是Microsoft的文档说的正确错误代码是针对找不到的文件的)。

  • 我的问题是:假设我已经告诉用户确切的错误信息(如果违反了一项验证规则)(例如,如果找不到该文件),那么我实际上从执行Environment.Exit(1);(例如)获得了任何 yield 吗?我确实从文档中意识到,它将把我指定的错误代码返回给操作系统,但是这实际上对我有什么帮助(特别是从编写没有“低级”操作的“纯” .NET应用程序的 Angular 来看) )?在这一点上,操作系统实际上有何不同之处?它对用户有何好处(或我自己的调试)?

    为了获得最大的利益,我是否需要在应用程序中执行任何“特殊”操作?

    最佳答案

    该退出代码可由应用程序中产生的任何其他进程使用。例如,有时您想从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工具)结合使用而设计的,以用于大量的命令行消耗,则您可能需要针对不同的情况使用多个退出代码并进行记录,但实际情况并非如此。而且您不需要使用Environment.Exit-只需更改Main的签名即可返回int:
    static int Main(string[] args) {...}
    

    关于c# - 为什么以及如何在Environment.Exit中使用Windows系统错误代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44830036/

    相关文章:

    c# - 如何告诉nuget将包资源文件添加为链接,而不是将它们复制到项目目录中

    node.js - 使用 Node cross-env 的多个命令的语法(windows 和 linux)

    c# - SetWindowPos/MoveWindow 持续存在问题

    c# - 如何在 C# 中使用预处理器指令仅在 Windows 10 上执行一些代码?

    c# - 帮助使用 NHibernate 映射类对象列表

    c# - .NET 网络 API : Set a different Refresh Token Expiration time for different users

    windows - 在 bat 文件上调整命令提示符

    c# - 将字符串解析为 int,XSL 样式表内的 C#

    c# - 将分层数据模型绑定(bind)到 DataGrid

    c# - 使用 MVC3 C# 进行分页的最简单方法?