50

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

4

7 に答える 7

54

2 つの可能性:

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

于 2008-09-21T18:23:38.617 に答える
15

CLRが爆発してExecutingEngineExceptionでダウンしない限り(.net 1.1で、適切な量のCOM相互運用性を備えた日をいくつか見ました:) ..最終的には常に実行する必要があると思います。

于 2008-09-21T18:21:28.683 に答える
6

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

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

于 2008-09-21T18:28:27.590 に答える
4

Finallyblock onbackground threadは実行されない場合があります。ただし、 の実行が完了する前に操作main foreground threadを終了する の実行が完了することに依存します。background threadbackground 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");
        }
    }
}
于 2016-11-21T14:05:20.750 に答える
2

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

于 2008-12-20T20:29:52.490 に答える
0

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

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

于 2011-09-21T20:03:22.133 に答える
0

async/await 以来、他の回答で言及されていない、最終的に無視される可能性のある別の方法があります。

static class Program
{
    [STAThread]
    static void Main()
    {
        async void ThreadExecutionAsync()
        {
            try
            {
                SynchronizationContext.SetSynchronizationContext(
                    new WindowsFormsSynchronizationContext());

                await Task.Yield(); // Yield to the context

                // The WindowsFormsSynchronizationContext will schedule the continuation
                // on the main thread, so the current thread will die
                // and we will never get here...
                Debugger.Break();
            }
            finally
            {
                // Will never get here either...
                Debugger.Break();
            }
        }

        var thread = new Thread(ThreadExecutionAsync);
        thread.Start();

        Application.Run();
    }
}
于 2020-06-05T14:05:56.677 に答える