基本的に私は特定の条件が.netがfinallyブロックを越えて打破する原因になると聞いた。誰もがそれらの条件が何であるか知っていますか?
2つの可能性
がある場合、finallyブロックは実行されません。StackOverflowException
スタックにこれ以上コードを実行する余地さえないので。それがあるときにも呼び出されませんExecutionEngineException
への呼び出しから発生する可能性がありますEnvironment.FailFast()
。
CLRが実行されてExecutingEngineExceptionが発生しない限り(.net 1.1日のうちに、適切な量のCOM相互運用機能が追加された状態でいくつか見てきました:)。常に実行します。
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メソッドもあります。
Environment.Exit
。Application.Exit
メインルーチンを続行することができますので、きっとFinally
ブロックが実行されます。 - Mark Hurd
finallyブロックに続くコードも、外側のスコープ内のコードも、finallyブロックが最初に開始されずに実行されることはありません(finallyブロック内の例外により、途中で終了する可能性があります。外側の範囲)。 finallyブロックより前のコードが無限ループやメソッドが終了しない場合、または実行コンテキストが完全に破棄された場合は、finallyブロックは実行されません。
"Finalize"メソッド(またはC#の "デストラクタ")とは異なり、finallyブロックに依存するのが適切であることに注意してください。