2008-09-21 7 views

답변

44

두 가지 가능성 :

도 더 이상 코드를 실행할 수있는 스택에 여지가 없다 이후 StackOverflowException이 때 finally 블록이 실행되지 않습니다. ExecutionEngineException이있을 때 호출되지 않으며 Environment.FailFast()으로 전화하여 발생할 수 있습니다.

+3

ExecutingEngineException은 무엇에서 OutOfMemoryException 및 ThreadAbortException이에 대해 Environment.FailFast() –

+4

에 대한 호출에서 발생할 수 있음을 지적 아마도 가치가? –

+3

B.T.W. ExecutingEngineException 대신 ExecutionEngineException이 있어야한다고 생각합니까? –

14

ExecutingEngineException을 사용하여 CLR이 터지거나 내려 가지 않는 한 (맞습니다 .1.1 일 동안 COM Interop의 올바른 양을 보았습니다 :) 결국 은 항상이어야합니다.

5

try 블록이 입력되기 전에 try 블록의 코드로 인해 SecurityException이 발생하는 상황이 발생할 수 있습니다 (포함 된 메서드가 호출 될 때 예외가 throw됩니다 (http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx 참조). 심지어 finally 블록의 코드가 호출되지 않도록 try 블록을 입력하십시오.

다른 가능성으로는 StackOverflowException 및 ExecutingEngineException이 있습니다.

1

또한 Application.Exit 메서드가 있습니다.

+2

'Environment.Exit'을 의미합니다. 'Application.Exit'은 메인 루틴이 계속되도록하기 때문에'Finally' 블록이 실행됩니다. –

0

finally 블록 다음에 오는 코드 나 외부 범위의 코드는 finally 블록이 먼저 시작되지 않고 실행되지 않습니다 (finally 블록 내의 예외로 인해 중간 블록이 조기에 종료 될 수 있습니다.이 경우 실행이 finalizer는 외부 범위로). finally 블록 이전의 코드가 무한 루프 또는 종료되지 않는 메소드에서 멈추거나 실행 컨텍스트가 모두 삭제 된 경우 finally 블록이 실행되지 않습니다.

"Finalize"메서드 (또는 C# "소멸자")와 달리 finally 블록에 의존하는 것이 적절하다는 점에 유의하십시오.

3

Finallybackground thread 블록이 실행되지 않을 수 있습니다. 그러나 background thread의 완료 실행 전에도 작업을 종료하는 main foreground 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"); 
     } 
    } 
}