c#应用程序中的Environment.FailFast

c#应用程序中的Environment.FailFast,c#,.net,windows,debugging,exception,C#,.net,Windows,Debugging,Exception,我想了解c#应用程序中的环境.FailFast规则。因此,我制定了以下代码: public static void Main() { string strInput = GetString(); Console.WriteLine(strInput); Console.ReadKey(); } private static string GetString() { Console.WriteLine("Get

我想了解c#应用程序中的
环境.FailFast
规则。因此,我制定了以下代码:

  public static void Main()
   {
       string strInput = GetString();
       Console.WriteLine(strInput);
       Console.ReadKey();
   }

   private static string GetString()
   {
       Console.WriteLine("Get string");
       string s = Console.ReadLine();
       try
       {
           if (s == "Exit")
           {
                Environment.FailFast("Erreur fatale");
                return s;
           }
           else
           {
               return s;
           }
       }
       catch (Exception)
       {
           return "catch";
       }
       finally
       {
           s += "finally";
       }
   }
据我所知,消息将写入
Windows应用程序事件日志
,应用程序将终止

当我运行应用程序并将
Exit
作为字符串放入时:

  • debbugger指示一个错误:
  • 我尝试查找事件日志文件,如中所示,但未找到它

  • 我不明白为什么应用程序没有关闭而不抛出异常?关于第二点,我如何在我的电脑中找到日志文件?

    我用以下代码重建了您的问题:

    static void Main(string[] args)
    {
        try
        {
            Console.WriteLine("Foo");
            Environment.FailFast("WOHO!");
        }
        finally { }
    }
    
    在调试器下运行此时,我也没有看到任何注册的异常。在不使用调试器的情况下运行此(Ctrl+F5)会使异常正确地显示在事件查看器中(请参阅@aevitas ANSWERT或read了解发生这种情况的原因):

    环境。FailFast(字符串)
    立即退出应用程序,而不允许在对象上运行任何
    catch
    语句或终结器

    只有当应用程序的状态处于无法恢复的状态时,才应使用此方法,并且退出应用程序是确保不会发生比崩溃更糟糕的情况的唯一方法。在您的示例中,使用带有退出代码的
    Environment.Exit
    更合适,因为它看起来是一个优雅的退出,而不是一个被迫通过损坏状态的退出

    通常,建议在连接调试器时不要使用FailFast,这是:

    这意味着您在VisualStudio中看到的异常是CLR中的一个bug,可以安全地忽略它

    他们的工作方法如下:

    if (Debugger.IsAttached) 
        Environment.Exit(COR_E_FAILFAST);
    else
        Environment.FailFast(message); 
    

    这意味着在附加了调试器的情况下运行时,不会写入事件日志消息,而在发布时会写入事件日志消息

    在事件查看器中,展开左侧面板上的“Windows日志”(或“Journaux Windows”),然后单击“应用程序”。@dcastro我得到一个空列表
    if (Debugger.IsAttached) 
        Environment.Exit(COR_E_FAILFAST);
    else
        Environment.FailFast(message);