2013-12-12 3 views
0

프로젝트에 대해 해결할 수없는 문제가 있습니다.무한 루프의 처리되지 않은 예외

namespace TestApp 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(UnhandledExceptionsHandler); 

     int[] a = { 0, 1, 2 }; 
     int y = a[6]; 
    } 

    public static void UnhandledExceptionsHandler(object sender, UnhandledExceptionEventArgs e) 
    { 
     try 
     { 
      File.AppendAllText("Exceptions.log", (e.ExceptionObject as Exception).Message); 
     } 
     catch (Exception ex) 
     { 
      Environment.Exit(1); 
     } 
    } 
} 
} 

처리되지 않은 예외 처리기는 실제로 처리되지 않은 예외를 원하는대로 잡고 로그 파일에 메시지를 작성합니다. 그러나 핸들러를 종료하면 코드가 범위를 벗어나는 인덱스와 함께 다시 시작됩니다. int y = a [6]. 다음 코드 줄로 이동하거나 처리되지 않은 예외 (일반적으로이 경우 앱 종료)로 진행하려면 코드가 필요합니다. 그것이 그대로, 처리되지 않은 예외를 throw하는 무한 루프에 처리됩니다/처리되지 않은 예외 이벤트 처리기를 누르십시오. 핸들러에서

+3

'try/catch' 대신'try/finally'를 사용 하시겠습니까? – Jon

답변

3

당신이 원하는 try..finally :

당신은 이제 로그 파일을 기록 할 때 발생하는 오류를 잡는 것을
try { 
    File.AppendAllText("Exceptions.log", (e.ExceptionObject as Exception).Message); 
} 
finally { 
    Environment.Exit(1); 
} 

. 오류가 없으면 (아무 것도 없습니다) .. 메소드를 끝내고 원래 예외로 버블 링합니다.

+0

하지만 핸들러에서 실행이 종료되는 것을 원하지 않습니다. 실행을 원 코드에서 다시 시작하겠습니다. –

+1

할 수 없습니다. 기본적으로 모든 호출 범위에서 "호출 사이트"를 래핑 할 수는 없습니다. 그렇게했다면 해당 범위에서 선언 된 변수는 외부에서 액세스 할 수 없기 때문입니다. 그래서 시도한 인덱스 액세스를'try ... catch'로 감싸서 예외를 잡으려한다면 ... 초기화되지 않은 것으로 선언 될 것이기 때문에 코드는 "계속 진행"할 수 없습니다. –