質問

基本的に、特定の条件によって .net がfinally ブロックを超えてしまうという話を聞いたことがあります。それらの条件が何なのか知っている人はいますか?

役に立ちましたか?

解決

2 つの可能性:

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

他のヒント

CLR が爆発して ExecutingEngineException でダウンしない限り (適切な量の COM 相互運用機能を備えた .net 1.1 日をいくつか見たことがあります :) 。最終的にはそうすべきだと思います いつも 実行する。

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

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

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");
        }
    }
}

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

finally ブロックに続くコードも、外側のスコープ内のコードも、finally ブロックが最初に開始されないと実行されません (finally ブロック内の例外により途中で終了する可能性があり、その場合、実行はファイナライザーからジャンプして実行されます)外側のスコープ)。finally ブロックより前のコードが無限ループや終了しないメソッドに陥った場合、または実行コンテキストが完全に破壊された場合、finally ブロックは実行されません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top