2

このコードに注意してください:

 class CTestFinally
  {
      public static void Run()
      {
          try
          {
              TryAndTry();
          }
          catch (Exception exError)
          {
              Console.WriteLine(exError.Message);
          }
          finally
          {
              Console.WriteLine("Finally...!");
          }
          Console.ReadKey();
      }

      static void TryAndTry()
      {
          try
          {
              TryAndTry();
          }
          catch (Exception exError)
          {
              Console.WriteLine(exError.Message);
          }
          finally
          {
              Console.WriteLine("Try: Finally...!");
          }
          }
}
      }

スタックオーバーフローエラーが発生するため、最後に実行されることはありません。

上記の問題以外にfinallyブロックが実行されない状況はありますか?

4

2 に答える 2

5

StackOverflowExceptionこれは、CLRホストが通常特別に処理する数少ない種類の例外の1つです。たとえば、ASP.NETはワーカープロセスを強制終了します。アプリがなくなるだけなので、これをデバッグするのは非常に困難です。SQL Serverには、私が確信している同様のポリシーがあります(appdomainのアンロードなど)。

その理由は、これが不安定な状態であり、信頼できるエラー回復ができないためです(結局、スタックは使用できなくなります。たとえば、ロガーに電話したり、電子メールを送信したりすることはできません。スタックに空きがありません)。

この種のもう1つは、OutOfMemoryExceptionです(例外を割り当てることもできません。そのため、CLRは1つのOOMインスタンスを事前に割り当てます...)。SQL Serverがアプリドメインを強制終了する間、ASP.NETはこれを許容すると思います。

通常の例外の場合、これは正常に機能します。

于 2013-03-25T09:57:46.733 に答える
2

これは決して実行されませんfinally

using System;

namespace Demo
{
    public static class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("In try");
                Environment.FailFast("Aaaaaargh");
            }

            finally
            {
                Console.WriteLine("In finally");
            }
        }
    }
}
于 2013-03-25T10:00:36.547 に答える