【问题标题】:What is the exit code of a C# program that throws an exception out of main?从 main 中抛出异常的 C# 程序的退出代码是什么?
【发布时间】:2017-08-28 22:34:23
【问题描述】:

在 C# 程序中,当从 main 抛出异常时定义的退出代码是什么?我知道您可以按照this excellent answer 中所述的多种方式设置退出代码。但令我感到非常惊讶的是,当从 main 中抛出异常时,我找不到退出代码的 值定义为 的文档。是否有一个标准来定义在这种情况下退出代码的值是多少,或者它是否取决于操作系统(或机会,或其他任何东西)?

【问题讨论】:

  • @STLDevloper...这个问题是 main() 函数特有的。
  • 在 main() 中被踢出和在其他地方被踢出没有区别。无论如何,任何退出代码都是无效的;如果你给自己设定的不是成功或失败,那是没有意义的。对你来说很重要,不要让异常逃逸并自己设置,然后干净地退出。
  • 是的,程序如何终止。但是有什么特别的......当它在 main() 中时?
  • @KenWhite 这正是我的问题:当异常从 Main 中爆发并终止程序时,是否有一个 defined 值我可以放心检查,或者将它是一些随机或未定义的值,从而迫使我捕获异常并明确设置返回值?您能否指出任何说明当 main 由于异常而终止时返回值是什么的文档?

标签: c#


【解决方案1】:

用户处理它。打开一个cmd提示窗口,运行一个程序yourblahprogram<ENTER>doecho %ERRORLEVEL%

0 表示没有错误。非零表示错误。

我将使用 DIR,但您可以使用您的程序

C:\Users\user\aa\a>dir
 Volume in drive C has no label.
 Volume Serial Number is B411-D580

 Directory of C:\Users\user\aa\a

03/04/2017  11:11 PM    <DIR>          .
03/04/2017  11:11 PM    <DIR>          ..
               0 File(s)              0 bytes
               2 Dir(s)  15,943,544,832 bytes free

C:\Users\user\aa\a>echo %ERRORLEVEL%
0

C:\Users\user\aa\a>dir sdsklfjdlkdfjs
 Volume in drive C has no label.
 Volume Serial Number is B411-D580

 Directory of C:\Users\user\aa\a

File Not Found

C:\Users\user\aa\a>echo %ERRORLEVEL%
1

C:\Users\user\aa\a>

你可以据此行事

C:\Users\user>if NOT ERRORLEVEL 0  echo asdf

虽然实际上上面的内容并不是那么好,因为它只有在错误级别为负时才能正常工作。'因为不是错误级别 0 表示不 >=0。正如你从 If /?来自Foolproof way to check for nonzero (error) return code in windows batch file

所以如果不是错误级别 0 这会更好。IF %ERRORLEVEL% NEQ 0 echo asdf

所以如果你的代码是throw new System.Exception();

C:\Users\user>a.exe
asdf

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was thrown.
   at CustomMath.Main()

C:\Users\user>echo %ERRORLEVEL%
-532462766

C:\Users\harvey>

所以你可以采取行动。

windows cmd批处理脚本中除了if,还有&&和||

假设程序执行 WriteLine("asdf");并抛出异常。

这意味着运行 && 左边的第一件事,如果它没有返回错误,即错误级别 0,然后运行第二件事,右边。所以你看到第一个例子没有运行 echo qwerty,它没有显示 qwerty。

C:\Users\user>a.exe && echo qwerty
asdf

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was thrown.
   at CustomMath.Main()

现在看第二个例子。 ||是 OR,因此如果左侧或右侧为真,它将运行,但它会很有效,因此只要其中一个为真,它就会完成。左边先运行,失败了,所以继续往右边运行,会显示qwerty。

C:\Users\user>a.exe || echo qwerty
asdf

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was thrown.
   at CustomMath.Main()
qwerty

C:\Users\user>

所以,你使用你的操作系统来处理它。

在 linux 上会有所不同,但相似。

【讨论】:

  • 谢谢你,@barlop。我确实理解用户可以处理程序返回给 shell 的不同代码,感谢您的解释。但是,我希望了解发生异常时代码的内容是否有标准定义。我不是在问如何处理该代码。
  • @MarkMeuer 可能有一个标准 0 表示没有错误,非零或负数表示错误.. 但我不确定写在哪里。如果这真的是您要问的,那么您的问题写得非常糟糕,询问错误代码会发生什么。
  • 我已经更新了我的问题以试图澄清。如果我在您的回答中造成了额外的工作,我很抱歉。我只是在寻找有关在 C# 程序中从 main 抛出异常时退出值的文档。
  • @MarkMeuer 好吧,如果它正在输出某个内存位置的内容,那么除了该内存位置中恰好存在的任何值之外,不会有任何特定值,这可能是任何东西。
  • @MarkMeuer 有趣的一点.. 我确实得到了与 jeffrey 相同的值,是的,如果任何文档说未定义或者它应该是负面的或关于它的东西,那会很有趣.. 我认为你的问题很好
【解决方案2】:

我观察到-532462766

PS C:\Projects\Throw\Throw\bin\Debug> .\Throw.exe

未处理的异常:System.Exception:在 c:\Projects\Throw\Throw\Program.cs:line 13 中的 Throw.Program.Main(String[] args) 处引发了“System.Exception”类型的异常

PS C:\Projects\Throw\Throw\bin\Debug> $LASTEXITCODE
-532462766

【讨论】:

  • 这就是方法 - 试试吧,自己找出来!
  • 我知道可以观察到。然而,我的问题是,是否存在所有操作系统和环境中已知的任何 defined 行为。如果它在我的系统上设置了特定代码,我不知道在 Mac、Linux 和 Windows 上运行时是否会有所不同,或者它是否取决于特定的异常。例如,如果我使用不同的异常子类会有所不同吗?
  • @Rufus L 实际上这不是“方式”。这表明那天在该机器上使用该程序时,它就这样退出了。它并不表明所有机器上的所有程序都保证总是这样退出。
  • @pm100 有史以来最好的评论。
【解决方案3】:

如果您正在寻找一个成功的退出,我只会寻找零。零是标准的“一切都很好”的代码。在 Windows 的 Dot net 中,根据我的经验,任何未处理的异常都会导致负退出代码(我相信这个数字是基于异常类型的)。 Linux / BSD(又名 MAC)中没有负退出代码,所以我假设未处理的异常是 255(IIRC,“我们不知道到底坏了,但确实坏了”代码。

因此,如果您正在寻找跨平台解决方案,只需将error code != 0 视为失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多