2011-01-25 6 views
1

검색되지 않은 탐험에 대한 약간의 크래시 리포터를 작성하려고했습니다. 이 VS에서 내 응용 프로그램을 시작할 때 완벽하게 작동합니다. 그러나 .exe를 시작하려고하자마자 창에서 "숨겨진 탐구가 있습니다"라는 표준 만 보여줍니다. 그리고 크래시 리포터는 고장 나지 않습니다.Program.cs의 Try-Catch는 Visual Studio에서 시작한 경우에만 작동합니다.

이는 Program.cs

 try 
     { 
      Application.Run(new TestServer()); 
     } 
     catch (Exception e) 
     { 
      Application.Run(new CrashReporter(e.StackTrace.ToString())); 
     } 
    } 
+0

'StackTrace'는 이미 문자열입니다. 실제 문제를보고 할 수 있도록'e.ToString()'을 전달해야합니다. – SLaks

+0

CrashReporter 클래스 코드를 게시 할 수 있습니까? –

+0

CrashReporter가 아닌 것을 어떻게 압니까? 'MessageBox.Show (e.ToString())'를 먼저 추가하고 표시되는지 확인하십시오. – SLaks

답변

6

이것은 디버거를 사용하기 때문입니다. Winforms가이를 감지하고 Application.ThreadException에 대한 이벤트 처리기를 비활성화합니다. 중요한 점은 예외를 디버그 할 수 있다는 것입니다. 디버거없이 작동하도록 캐치 절을 얻으려면, 당신은 실행() 호출하기 전에, 당신의 main() 메소드에이 문을 추가해야합니다 :

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); 

을 그것은 지금 이벤트를 쓰는 것이 더 의미가 않습니다 처리기에서 AppDomain.Current.UnhandledException 대신 처리기 스레드의 처리되지 않은 예외에 대한 알림을받습니다.

+0

감사합니다! 이제 다 괜찮아! – Martin

0

내 코드는 64 비트 OS에서 실행중인입니까? Hans Passant가 대답 한 문제인 것 같습니다. here. 64 비트 CLR에서 양식 건설 및 Forms_Load에 오류를 삼킬 수

디버깅 ... 당신이 (처리되지 않은 응용 프로그램의 예외를 처리하는 기본 방법입니다) 다음과 같은 이벤트 처리 할 수있는이 대신

3

:

AppDomain.CurrentDomain.UnhandledException += (sender, e) => 
{ 
    Application.Run(new CrashReporter(e.StackTrace.ToString())); 
} 
Application.Run(new TestServer()); 
+0

이것은 나를 위해 작동하지 않았다 – Martin

+1

어떤 의미로 작동하지 않았습니까? – Andrey

0

이게 제대로 작동합니까? 이전에이 전략이 효과가 있었나요?

나는 세계적으로 처리되지 않은 예외를 잡기 위해이 방법을 사용 (및 방법 제안) :

여기
AppDomain.CurrentDomain.UnhandledException += 
      new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 
//then start the main form... 
Application.Run(new TestServer()); 

http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx

-2

CrashReporter가 원인이되는 문서입니다. catch 문에서 catch되지 않은 예외가 발생하면 catch되지 않는 예외가 발생합니다. 너는 또 다른 try/catch가 너의 캐치에 잡히고 또 다시 너는 fall back이 필요하다.

+0

아니요 .. catch 블록이 호출되지 않습니다. – Martin

관련 문제