c# - 응용프로그램에서 - .NET 1.1에서 처리되지 않은 예외 처리기



visual studio 예외가 처리되지 않음 (4)

나는 .NET 1.1 응용 프로그램을 유지 관리하고 있으며 사용자에게 친숙하지 않은 오류 알림이 표시되지 않도록하고 있습니다.

Application.ThreadExceptionAppDomain.CurrentDomain.UnhandledException 에 핸들러를 추가했습니다.이 핸들러는 호출됩니다. 내 문제는 표준 CLR 오류 대화 상자가 여전히 (예외 처리기가 호출되기 전에) 표시됩니다.

Jeff는이 블로그의 여기여기 에서이 문제에 대해 이야기 합니다 . 그러나 해결책이 없습니다. 그렇다면 .NET 1.1의 표준 방법은 catch되지 않는 예외를 처리하고 친숙한 대화 상자를 표시하는 것입니다.

제프의 ​​대답은 정답으로 표시되었습니다. 왜냐하면 그가 제공 한 링크가 필요한 것을 수행하는 방법에 대한 가장 완벽한 정보를 갖고 있기 때문입니다.

https://src-bin.com


Answer #1

AppDomain.UnhandledException 은 전역 예외 처리기가 아닌 이벤트 입니다. 즉, 응용 프로그램이 생성 될 때까지 응용 프로그램이 이미 유출 된 상태이므로 정리 및 오류 로깅을 제외하고 수행 할 수있는 작업은 없습니다.

배후에서 일어난 일은 다음과 같습니다. 프레임 워크가 예외를 감지하고 호출 스택을 맨 위에 올렸으며 오류에서 복구 할 핸들러가 없으므로 실행을 계속 수행 할 수 있는지 여부를 결정할 수 없었습니다. 그래서, 종료 시퀀스를 시작하고, 당신이 이미 운명을 정한 프로세스에 대한 당신의 존경을 지불 할 수 있도록 당신에게 호의 로서이 이벤트를 해고했다. 이 예외는 메인 스레드에서 처리되지 않은 채로 남아있을 때 발생합니다.

이러한 종류의 오류에는 단일 지점 솔루션이 없습니다. 이 오류가 발생하는 모든 장소의 실제 예외 처리기 (catch 블록)를 배치하고이를 (예를 들어) 전역 처리기 메서드 / 클래스에 전달하여 보고서를 작성하고 계속 진행하는 것이 안전한지 결정합니다. 예외 유형 및 / 또는 내용.

편집 : Windows에 내장 된 오류보고 메커니즘을 비활성화 (= 해킹) 할 수 있으므로 앱이 다운되었을 때 필수 "충돌 및 레코딩"대화 상자가 표시되지 않습니다. 그러나 이는 시스템의 모든 응용 프로그램에 효과적입니다.


Answer #2

.NET 1.x Windows Forms 응용 프로그램에서 처리되지 않은 예외 동작은 다음 사항에 따라 달라집니다.

  • 예외를 Throw 한 thread의 타입
  • 창 메시지 처리 중에 발생했는지 여부
  • 디버거가 프로세스에 연결되었는지 여부
  • DbgJitDebugLaunchSetting 레지스트리 설정
  • App.Config의 jitDebugging 플래그
  • Windows Forms 예외 처리기를 무시할지 여부
  • CLR의 예외 이벤트 처리 여부
  • 달의 위상

처리되지 않은 예외의 기본 동작은 다음과 같습니다.

  • 창 메시지를 펌핑 할 때 주 스레드에서 예외가 발생하면 Windows Forms 예외 처리기에 의해 인터셉트됩니다.
  • 창 메시지를 펌핑 할 때 주 스레드에서 예외가 발생하면 Windows Forms 예외 처리기에서 인터셉트하지 않는 한 응용 프로그램 프로세스가 종료됩니다.
  • 예외가 manual, threadpool 또는 finalizer 스레드에서 발생하면 CLR에 의해 삼켰습니다.

처리되지 않은 예외에 대한 연락 지점은 다음과 같습니다.

  • Windows Forms 예외 처리기입니다.
  • JIT 디버그 레지스트리는 DbgJitDebugLaunchSetting을 전환합니다.
  • CLR 처리되지 않은 예외 이벤트입니다.

Windows Form 기본 제공 예외 처리는 기본적으로 다음을 수행합니다.

  • 다음의 경우에 처리되지 않는 예외를 캐치합니다.
    • 예외가 주 스레드에 있고 디버거가 연결되어 있지 않습니다.
    • 예외는 창 메시지 처리 중에 발생합니다.
    • App.Config에서 jitDebugging = false.
  • 사용자에게 대화 상자를 표시하고 앱이 종료되지 않도록합니다.

App.Config에서 jitDebugging = true를 설정하여 후자 동작을 비활성화 할 수 있습니다. 그러나 이것이 앱 종료를 막을 수있는 마지막 기회 일 수 있음을 기억하십시오. 그래서 처리되지 않은 예외를 잡으려는 다음 단계는 Application.ThreadException 이벤트를 등록하는 것입니다 (예 :

Application.ThreadException += new
Threading.ThreadExceptionHandler(CatchFormsExceptions);

HKEY_LOCAL_MACHINE \ Software.NetFramework 아래의 레지스트리 설정 DbgJitDebugLaunchSetting에 유의하십시오. 여기에는 내가 알고있는 세 가지 값 중 하나가 있습니다.

  • 0 : "디버그 또는 종료"를 묻는 사용자 대화 상자를 보여줍니다.
  • 1 : CLR이 처리 할 예외를 허용합니다.
  • 2 : DbgManagedDebugger 레지스트리 키에 지정된 디버거를 시작합니다.

Visual Studio에서 도구옵션디버깅JIT 로 이동하여이 키를 0 또는 2로 설정합니다. 그러나 일반적으로 값 1은 최종 사용자의 컴퓨터에서 가장 좋습니다. 이 레지스트리 키는 CLR 처리되지 않은 예외 이벤트 전에 처리됩니다.

이 마지막 이벤트는 처리되지 않은 예외를 기록 할 마지막 기회입니다. Finally 블록이 실행되기 전에 트리거됩니다. 다음과 같이이 이벤트를 차단할 수 있습니다.

AppDomain.CurrentDomain.UnhandledException += new
System.UnhandledExceptionEventHandler(CatchClrExceptions);

Answer #3

아, Windows Forms에서는 제대로 작동 할 수 있어야합니다. 당신이주의해야 할 유일한 것은 다른 스레드에서 일어나는 일입니다.

여기에 도움이 될만한 코드 프로젝트 문서가 있습니다.

사용자에게 익숙한 예외 처리


Answer #4

이것은 콘솔 응용 프로그램입니까, 아니면 Windows Forms 응용 프로그램입니까? .NET 1.1 콘솔 응용 프로그램 인 경우 슬프게도 이것은 의도적으로 설계된 것입니다. MSFT 개발자가 참조한 두 번째 블로그 게시물 에서 확인되었습니다.

BTW, 내 1.1 컴퓨터에서 MSDN에서 예를 들어 예상되는 출력을 가지고; 디버거를 연결 한 후에야 두 번째 줄이 나타나지 않습니다. v2에서는 디버거가 연결되기 전에 UnhandledException 이벤트가 발생하도록 대부분의 사람들이 예상하는 것으로 보이는 것들을 뒤집어 놓았습니다.

.NET 2.0은이 기능을 더 잘 수행 한 것 같지만 (솔직히 고맙다) 솔직히 돌아가서 점검 할 시간이 없었습니다.





exception-handling