2013-08-30 4 views
2

예외가 발생할 때마다 "응용 프로그램 has stopped working"팝업이 나타나지 않도록하고 싶습니다. 이렇게하는 한 가지 방법은 분명 이런 즉 AppDomain.CurrentDomain.UnhandledException 글로벌 예외 핸들러 Environment.Exit(1) 호출된다 AppDomain.CurrentDomain.UnhandledException 핸들러에서 응용 프로그램을 종료하고 finally {} 블록이 실행되는지 확인하는 방법은 무엇입니까?

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{    
    Exception exc = (Exception)e.ExceptionObject; 
    Console.Error.WriteLine("Exception:\n{0}", exc.Message); 
    Console.Error.WriteLine("Stack trace:\n{0}", exc.StackTrace); 

    Environment.Exit(1); // quit silently on exception, don't show the popup      
} 

하지만, finally 블록에서 상기 코드 결과는 실행 순서에 의한 실행하지. 이러한 동작의 간단한 예를 들어이 출력 예외 핸들러 결과

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
    try 
    { 
     Console.WriteLine("try block"); 
     throw new Exception("Somebody set us up the bomb."); 
    } 
    catch 
    { 
     Console.Error.WriteLine("catch block"); 
     throw; 
    } 
    finally 
    { 
     Console.WriteLine("finally block"); 
    } 

Environment.Exit(1) (예고없이 마지막 블록) 도장 전에이 종료 : 그것은 것이 중요 할 때

try block 
catch block 
Exception: 
     Somebody set us up the bomb. 
Stack trace: 
     at ... 

이 심각한 문제가 발생할 수있다 finally 블록이 실행됩니다. 내부의 임시 파일 정리시 try.

간단한 문제가 있습니까? 즉, 전역 예외 처리기를 유지하고 내부에 예외 출력 등을 사용자 정의한 다음 정상적으로 종료하지만 여전히 실행하려면 finally 블록을 확보해야합니다. 나는이 문제가 this과 같은 질문에서 언급되지 않았다는 것을 이상하게 생각한다.

+0

+1 누군가가 우리에게 폭탄을 설치했습니다. 귀하의 모든 기지 R은 우리 소유입니다! – jgauffin

답변

2

당신은 이것을 얻지 못할 것입니다. Environment.Exit()은 종료자가 여전히 실행되도록합니다. 이는 대체 될 수 있습니다. 하지만 임시 파일을 정리하지 않으려면 운영 체제 지원을 사용하고 FileOptions.DeleteOnClose 옵션을 사용하십시오.

일반적으로 CLR이 SOE 또는 FEEE로 폭탄을 청소하거나 사용자가 작업 관리자에서 응용 프로그램을 종료하거나 기기를 하드 재부팅하거나 전원이 나가면 정리를위한 하드 요구 사항에 의존해서는 안됩니다 떨어져서.

+0

고맙습니다. 중요한 작업에 대한 'finally'블록에 의존하는 것이 최적이 아니라는 것을 알고 있습니다. 예외 처리기 안에'Environment.Exit()'를 넣는 것이 통계적으로 말하면 (정전, 스택 오버 플로우 등을 제외하고) 나쁜 습관이라고 말할 수 있을까요? – w128

+0

Exit()를 사용하든 사용하지 않든 아무 효과가 없습니다. finally 블록은 어느쪽으로도 실행되지 않습니다. 그래서, 아니, 그것은 "나쁜 습관"이 아닙니다. –