2013-01-10 2 views
6

finally 블록은 프로그램이 실행되는 동안 항상 실행됩니다. 그러나,이 콘솔 응용 프로그램에서 finally 블록이 실행되지 않는 것 같습니다.왜 마침내 처형되지 않습니까?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       throw new Exception(); 
      } 
      finally 
      { 
       Console.WriteLine("finally"); 
      } 
     } 
    } 
} 

는 출력

Result

참고 : 예외가 발생되었을 때 나는 appliation을 종료하고 싶다면, 윈도우 나를 askmed, 나는 '예.'고 말했다

+4

클릭'no'를 제공하고 명령 줄에서 대신 그것은 매우 이상하게 보일 것 당신의 IDE –

+0

실행 그것을 어떻게되는지. 'finally'는 StackTrace 다음에 정확히 써야합니다. – KevinDTimm

+0

내 –

답변

2

"ConsoleApplication1"응답이 중지되면 두 가지 선택 사항이 있습니다. 취소를 누르면

Windows Error Reporting dialog

는 처리되지 않은 예외는 응용 프로그램이 종료되어 결국 때까지 계속 허용됩니다. 이렇게하면 finally 블록을 실행할 수 있습니다. 취소를 누르지 않으면 Windows Error Reporting이 프로세스를 중지하고 미니 덤프를 수집 한 다음 응용 프로그램을 종료합니다. 즉, finally 블록이 실행되지 않습니다.

더 높은 방법으로 예외를 처리하면 finally 블록을 볼 수 있습니다. 예를 들어 :

static void unhandled() 
{ 
    try 
    { 
     throw new Exception(); 
    } 
    finally 
    { 
     Console.WriteLine("finally"); 
    } 
} 

static void Main(string[] args) 
{ 
    AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper; 
    try 
    { 
     unhandled(); 
    } 
    catch (Exception) 
    { 
     // squash it 
    } 
} 

항상 출력 "결국"

6

실제로 실행되었습니다. 너는 눈치 채지 못했다. Windows is checking for a solution to the problem을 클릭하면 을 클릭하고을 취소하고 확인하십시오.

enter image description here

+1

어떤 환경에서 뛰고 있습니까? Windows 7, 64를 사용하고 있습니다. "Windows가 문제의 해결 방법을 확인 중입니다 ..."라는 메시지가 나타나면 취소를 클릭하지 마십시오. 그 일을 시키십시오. – Anish

+0

Windows 7-32 비트를 사용하고 있습니다. 그래 네가 맞아. –

3

그것은 당신이 디버깅하고 더 클릭하면 실행이 디버거에 의해 중단 될 가능성이 있습니다.

+0

이것이 진정한 이유입니다. –

2

명령 줄에서 실행 중일 때. Windows가 응용 프로그램을 정상적으로 종료하려고 시도 할 때 응용 프로그램이 응답하지 않으면 no 또는 cancel을 클릭하십시오. enter image description here

+0

어떤 환경에서 뛰고 있습니까? Windows 7, 64를 사용하고 있습니다. "Windows가 문제의 해결 방법을 확인 중입니다 ..."라는 메시지가 나타나면 취소를 클릭하지 마십시오. 그 일을 시키십시오. – Anish

+0

그러면 Windows는 콘솔에 인쇄하지 않고 응용 프로그램을 종료합니다. –

-2

예외는 처리기를 찾을 때까지 스택을 비 웁니다. 그렇지 않으면 프로그램이 종료됩니다. 그것은 시나리오의 경우입니다 ... 핸들러가 없으므로 finally 블록에 도달하기 전에 프로그램이 종료됩니다.

+2

-1 - 'finally'는 스택을 버블 링하기 전에 실행해야합니다. - 실제로는 스택 해제 중 *입니다. –

+0

어쨌든 잡기가 없다면 마침내 그 목적이 완전히 사라집니다. 그게 내게 새로운 것 : L – RhysW

+0

미안하지만, 그것은 사려 깊은 대답이었다. – ktm5124

관련 문제