43

기본적으로 나는 특정 조건으로 인해 .net이 finally 블록을 지나쳐 타격을 받았다고 들었습니다. 그 조건이 누구인지 압니까?

6 답변


47

두 가지 가능성 :

finally 블록은 실행될 때 실행되지 않습니다.StackOverflowException스택에 더 이상의 코드를 실행할 공간이 없기 때문입니다. 거기에 전화가 걸려 올 때도 전화하지 않습니다.ExecutionEngineException, 전화로 인해 발생할 수 있습니다.Environment.FailFast().


  • ExecutingEngineException이 Environment.FailFast () 호출에서 발생할 수 있다는 사실에 유의할 가치가 있습니다. - Daniel Fortunov
  • OutOfMemoryException 및 ThreadAbortException은 어떻습니까? - Wiebe Tijsma
  • B.T.W. ExecutingEngineException 대신 ExecutionEngineException이 있어야한다고 생각합니까? - Wiebe Tijsma
  • 나는이 RuntimeCallableWraper에 대한 COM 컨텍스트가 실패했습니다.설명 된 것과 유사한 오류stackoverflow.com/questions/36768352/…LINQ를 사용하여 SQL & lt; br & gt; 이것은 일반적인 방법으로 예외로 보이지는 않지만마침내우리가 자리에 블록. & lt; br & gt; 누구든지이 오류를 전에 본적이 있고 그것을 실행하지 않으면 확인할 수 있습니다.마침내블록? - Luke T O'Brien

14

CLR이 날아 오르고 ExecutingEngineException과 함께 떨어지지 않는 이상 (나는 COM Interop의 적당한 양을 가진 .net 1.1 일 동안 몇 가지를 보았습니다 :) 나는 마침내항상실행.


5

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

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


3

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


1

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


  • 네 말 뜻은Environment.Exit.Application.Exit메인 루틴을 계속 진행할 수 있으므로Finally블록이 실행됩니다. - Mark Hurd

0

finally 블록을 따르는 코드 나 외부 범위의 코드는 finally 블록이 먼저 시작되지 않고 실행되지 않습니다 (finally 블록 내의 예외로 인해 조기에 종료 될 수 있습니다.이 경우 실행이 종료 자에서 바깥 쪽 범위). finally 블록 이전의 코드가 무한 루프 또는 종료되지 않는 메소드에서 멈추거나 실행 컨텍스트가 모두 소멸되면 finally 블록이 실행되지 않습니다.

정상적으로 의존해서는 안되는 "Finalize"메서드 (또는 C # "소멸자")와 달리 finally 블록에 의존하는 것이 적절합니다.

연결된 질문


관련된 질문

최근 질문