43

基本的に私は特定の条件が.netがfinallyブロックを越えて打破する原因になると聞いた。誰もがそれらの条件が何であるか知っていますか?

6 답변


47

2つの可能性

がある場合、finallyブロックは実行されません。StackOverflowExceptionスタックにこれ以上コードを実行する余地さえないので。それがあるときにも呼び出されませんExecutionEngineExceptionへの呼び出しから発生する可能性がありますEnvironment.FailFast()


  • ExecutingEngineExceptionは、Environment.FailFast()の呼び出しによって発生する可能性があることに注意してください。 - Daniel Fortunov
  • OutOfMemoryExceptionとThreadAbortExceptionはどうですか? - Wiebe Tijsma
  • B.T.W. ExecutingEngineExceptionではなくExecutionEngineExceptionであるべきですか。 - Wiebe Tijsma
  • 私はこのRuntimeCallableWraperのCOMコンテキストは失敗しましたで説明されているのと同じようなエラーstackoverflow.com/questions/36768352/…私はLINQ to SQL< br>を使っています。これは通常の方法では例外とは見なされず、実行もされません。最後にブロックします。< br>誰もが以前にこのエラーを見たことがあり、それが実行されないかどうかを確認することができます最後にブロック? - Luke T O'Brien

14

CLRが実行されてExecutingEngineExceptionが発生しない限り(.net 1.1日のうちに、適切な量のCOM相互運用機能が追加された状態でいくつか見てきました:)。常に実行します。


5

tryブロックに入る前にtryブロック内のコードによってSecurityExceptionがスローされる状況が発生する可能性があります(代わりに、包含メソッドが呼び出されたときに例外がスローされます(参照)。http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx))、この状況ではtryブロックに入らないので、finallyブロック内のコードは呼び出されません。

他の可能性としては、StackOverflowException、ExecutingEngineExceptionがあります。


3

Finallyブロックオンbackground thread実行されない可能性があります。しかし、それはの完全な実行に依存しますmain foreground threadどちらが終わるbackground thread完全な実行前でも操作background thread

class Program
{

    static void Main(string[] args)
    {
        Program prgm = new Program();
        Thread backgroundThread = new Thread(prgm.CheckBgThread);
        backgroundThread.IsBackground = true;
        backgroundThread.Start();
        Console.WriteLine("Closing the program....");
    }

    void CheckBgThread()
    {
        try
        {
            Console.WriteLine("Doing some work...");
            Thread.Sleep(500);
        }
        finally
        {
            Console.WriteLine("This should be always executed");
        }
    }
}


1

Application.Exitメソッドもあります。


  • もしかしてEnvironment.ExitApplication.Exitメインルーチンを続行することができますので、きっとFinallyブロックが実行されます。 - Mark Hurd

0

finallyブロックに続くコードも、外側のスコープ内のコードも、finallyブロックが最初に開始されずに実行されることはありません(finallyブロック内の例外により、途中で終了する可能性があります。外側の範囲)。 finallyブロックより前のコードが無限ループやメソッドが終了しない場合、または実行コンテキストが完全に破棄された場合は、finallyブロックは実行されません。

"Finalize"メソッド(またはC#の "デストラクタ")とは異なり、finallyブロックに依存するのが適切であることに注意してください。

リンクされた質問


関連する質問

最近の質問