Environment.ExitCode Main 抛出异常时不遵守。如何 return 非零退出代码以及抛出异常?

Environment.ExitCode not respected when Main throws exception. How to return nonzero exitcode as well as throwing exception?

// Net core 3.1 Console application
class Program
{
   public static void Main()
   {
      Environment.ExitCode = 1;
      throw new Exception("boom");
   }
}

以上代码导致退出代码 0!

我预计会是 1

https://docs.microsoft.com/en-us/dotnet/api/system.environment.exitcode?view=netcore-3.1 表示 "Gets or sets the exit code of the process."。此外,"If the Main method returns void, you can use this property to set the exit code that will be returned to the calling environment."

如果我删除异常抛出,退出代码是预期的 1

我认为 Environment.ExitCode 的重点是指定一个退出代码,除非程序到达其他设置的点,否则将被使用。

如何确保退出代码不为零。同时仍然不需要捕获所有异常?我希望异常实际上与非零退出代码一起抛出,因为环境可以使用它来显示相关的错误消息。

我真的需要在捕获所有异常(为 AppDomain.CurrentDomain.UnhandledException 添加处理程序)或能够 return 我选择的退出代码之间做出选择吗?

我这里也发了个issuehttps://github.com/dotnet/runtime/issues/35599。有人指出,退出代码 0 似乎是 visual studio 特定的东西。它在正常环境中输出非零值。但是,自定义 Environment.ExitCode 仍然没有在异常情况下使用。异常处理是 OS 特定的——重要的是在 prod 中异常确实应该返回一个非零代码。 Environment.ExitCode 的行为有意不用于异常。