什么是抛出main的异常的C#程序的退出代码?

时间:2017-04-03 22:09:02

标签: c#

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

3 个答案:

答案 0 :(得分:0)

我观察 -532462766

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

未处理的异常:System.Exception:类型的异常' System.Exception'在C:\ Projects \ Throw \ Throw \ Program.cs:第13行中抛出Throw.Program.Main(String [] args)

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

答案 1 :(得分:0)

如果您正在寻找成功退出,我只会寻找零。零是标准"一切都很好"码。在Dot net for Windows中,根据我的经验,任何未处理的异常都会导致负退出代码(我相信该数字基于异常类型)。在Linux / BSD(又称MAC)中没有否定的退出代码,所以我认为未处理的异常是255(IIRC,"我们不知道确切地破坏了,但有些东西确实破坏了#34;代码。

因此,如果您正在寻找跨平台解决方案,请考虑error code != 0失败。

答案 2 :(得分:-1)

用户处理它。打开cmd提示窗口,运行程序yourblahprogram<ENTER>执行echo %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

虽然上面实际上并不是那么好但是只有当错误级别为负时才能正常工作。&#39; cos NOT ERRORLEVEL 0表示不是&gt; = 0。正如你从If /?看到的那样?从Foolproof way to check for nonzero (error) return code in windows batch file

所以如果不是errorlevel 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之外,还有&amp;&amp;和||

因此,让我们说该程序执行WriteLine(&#34; asdf&#34;);并抛出异常。

这意味着在&amp;&amp;&amp;&amp;如果它没有返回错误,即错误级别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上它会有所不同,但相似。