기본적으로 나는 특정 조건으로 인해 .net이 finally 블록을 지나쳐 타격을 받았다고 들었습니다. 그 조건이 누구인지 압니까?
두 가지 가능성 :
finally 블록은 실행될 때 실행되지 않습니다.StackOverflowException
스택에 더 이상의 코드를 실행할 공간이 없기 때문입니다. 거기에 전화가 걸려 올 때도 전화하지 않습니다.ExecutionEngineException
, 전화로 인해 발생할 수 있습니다.Environment.FailFast()
.
CLR이 날아 오르고 ExecutingEngineException과 함께 떨어지지 않는 이상 (나는 COM Interop의 적당한 양을 가진 .net 1.1 일 동안 몇 가지를 보았습니다 :) 나는 마침내항상실행.
try 블록의 코드가 try 블록이 입력되기 전에 throw되는 SecurityException을 발생시키는 상황을 얻을 수 있습니다 (대신 포함 된 메서드가 호출 될 때 예외가 throw됩니다.http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)),이 상황에서는 finally 블록의 코드가 호출되지 않도록 try 블록을 입력하지 않습니다.
다른 가능성으로는 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 블록에 의존하는 것이 적절합니다.