2011-09-16 2 views
0

모두Program.Main는 충돌 스택에 나타나지 않는 이유는

나는 메인 루틴의 모든 캐치되지 않는 예외를 처리하는 C# 응용 프로그램 쓰고 있어요 :

static void Main() 
    { 
     try 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new MainFrame());      
     } 
     catch (Exception e) 
     { 
      CrashReporter.Report(e); 
     } 
    } 

을 그리고 때 응용 프로그램을 실행하고을 (심지어 릴리스 빌드) 그것은 작동하는 비주얼 스튜디오에서. 하지만 한 번의 클릭으로 게시하고 설치하면 대부분의 경우 예외가 Main 함수에서 발견되지 않습니다. 예외 스택은 다음과 같습니다.

... 
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) 
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) 

메인은 스택에도 없습니다 ... 왜 그런 일이 생깁니 까? '모든 것을 잡으세요'와 같은 방법이 있습니까? 게시 된 대 로컬 빌드 동작이 다른 이유는 무엇입니까?


미리 감사 서지

답변

2

에 답변하려면 '모든 것을 잡으십시오'는 방법이 있습니까? 질문 AppDomain.UnhandledException

이 이벤트는 캐치되지 않는 예외 알림을 제공을 확인하십시오. 시스템 기본 핸들러가 예외를 사용자에게보고하고 응용 프로그램을 종료하기 전에 응용 프로그램이 예외에 대한 정보를 기록 할 수있게합니다. 응용 프로그램의 상태에 대한 충분한 정보가있는 경우 나중에 복구 할 수 있도록 프로그램 데이터를 저장하는 등의 다른 작업을 수행 할 수 있습니다. 예외가 처리되지 않으면 프로그램 데이터가 손상 될 수 있으므로주의해야합니다. ...

Application.ThreadException 이벤트.

이 이벤트를 사용하면 Windows Forms 응용 프로그램에서 Windows Forms 스레드에서 발생하는 처리되지 않은 예외를 처리 할 수 ​​있습니다. 이벤트 처리기를 ThreadException 이벤트에 연결하여 이러한 예외를 처리하면 응용 프로그램을 알 수없는 상태로 둡니다. 가능하면 예외는 구조화 된 예외 처리 블록에서 처리해야합니다. ...

2

에서 나는 예외가 주 스레드에서 발생되지 않았 음을 기대합니다.

분명히 다른 스레드는 스레드 기능이 진입 점이기 때문에 스택에 Main이 없습니다.

'nativewindow'콜백을 받고 있기 때문에 기본 윈도우가 다른 스레드에서 작동하고 있음을 의미합니다. 하나의 스레드에서 코드가 작동해야하는 경우에는 메시지 전달을 사용하거나 '호출'을 사용하여 콜백을 중계 할 수 있습니다.

0

예외 창 콜백 발생되고; 이벤트 디스패치 스레드에서 호출됩니다. 표시되는 스택 추적은 프로그램에서 시작되는 주 추적이 아니라 해당 스레드의 것입니다.

관련 문제