문제

저는 .NET 1.1 응용 프로그램을 관리하고 있는데 제가 맡은 일 중 하나는 사용자에게 불친절한 오류 알림이 표시되지 않도록 하는 것입니다.

핸들러를 추가했습니다. Application.ThreadException 그리고 AppDomain.CurrentDomain.UnhandledException, 호출됩니다.내 문제는 (예외 처리기가 호출되기 전에) 표준 CLR 오류 대화 상자가 계속 표시된다는 것입니다.

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

Jeff가 제공한 링크에는 필요한 작업을 수행하는 방법에 대한 가장 완전한 정보가 포함되어 있기 때문에 Jeff의 응답이 정답으로 표시되었습니다.

도움이 되었습니까?

해결책

아, Windows Forms에서는 확실히 작동하게 할 수 있어야 합니다.주의해야 할 유일한 것은 다른 스레드에서 일어나는 일들입니다.

여기에 도움이 될 오래된 코드 프로젝트 기사가 있습니다.

사용자 친화적인 예외 처리

다른 팁

AppDomain.UnhandledException 이다 이벤트, 전역 예외 처리기가 아닙니다.즉, 문제가 발생할 때쯤에는 애플리케이션이 이미 중단되고 정리 및 오류 로깅을 수행하는 것 외에는 할 수 있는 일이 없다는 의미입니다.

뒤에서 일어난 일은 이렇습니다.프레임워크는 예외를 감지하고 호출 스택을 맨 위로 올라가며 오류를 복구할 핸들러를 찾지 못하여 실행을 계속해도 안전한지 판단할 수 없습니다.따라서 종료 순서가 시작되었고, 귀하가 이미 종료된 프로세스에 경의를 표할 수 있도록 귀하에 대한 호의로 이 이벤트를 시작했습니다.이는 메인 스레드에서 예외가 처리되지 않은 상태로 남아 있을 때 발생합니다.

이런 종류의 오류에 대한 단일 지점 해결책은 없습니다.이 오류가 발생하는 모든 위치의 업스트림에 실제 예외 처리기(catch 블록)를 배치하고 이를 기반으로 간단히 보고하고 계속하는 것이 안전한지 결정하는 전역 처리기 메서드/클래스(예:)로 전달해야 합니다. 예외 유형 및/또는 내용.

편집하다:Windows에 내장된 오류 보고 메커니즘을 비활성화(해킹)하여 앱이 다운될 때 필수 "충돌 및 굽기" 대화 상자가 표시되지 않도록 할 수 있습니다.그러나 이는 다음과 같은 경우에 효과적입니다. 모두 자신의 애플리케이션뿐만 아니라 시스템의 애플리케이션에도 적용됩니다.

.NET 1.x Windows Forms 애플리케이션의 처리되지 않은 예외 동작은 다음에 따라 달라집니다.

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

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

  • 창 메시지를 펌핑할 때 기본 스레드에서 예외가 발생하면 Windows Forms 예외 처리기가 이를 가로챕니다.
  • 창 메시지를 펌핑할 때 기본 스레드에서 예외가 발생하면 Windows Forms 예외 처리기가 이를 가로채지 않는 한 앱 프로세스가 종료됩니다.
  • 수동, 스레드 풀 또는 종료자 스레드에서 예외가 발생하면 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);

이것은 콘솔 애플리케이션입니까, 아니면 Windows Forms 애플리케이션입니까?.NET 1.1 콘솔 응용 프로그램이라면 이는 안타깝게도 의도적으로 설계된 것입니다. MSFT 개발자가 다음에서 확인했습니다. 당신이 참조한 두 번째 블로그 게시물:

그런데 내 1.1 컴퓨터에서는 MSDN의 예제에 예상된 출력이 있습니다.단지 디버거를 연결하거나 연결하지 않을 때까지 두 번째 줄이 표시되지 않을 뿐입니다.v2에서는 디버거가 연결되기 전에 UnhandledException 이벤트가 발생하도록 상황이 바뀌었습니다. 이는 대부분의 사람들이 기대하는 것 같습니다.

.NET 2.0이 이 기능을 더 잘 수행하는 것 같지만(다행히도) 솔직히 돌아가서 확인할 시간이 없었습니다.

Windows Forms 응용 프로그램입니다.Application.ThreadException에 의해 포착된 예외는 정상적으로 작동하지만 보기 흉한 .NET 예외 상자(좋아요 종료하다, 취소 디버그하려고?누가 그걸 생각해냈어??).

이에 따라 포착되지 않는 몇 가지 예외가 발생했고 결국 문제를 일으키는 AppDomain.UnhandledException 이벤트가 발생했습니다.저는 이러한 예외를 대부분 포착했다고 생각하며 이제 이를 멋진 오류 상자에 표시하고 있습니다.

따라서 Application.ThreadException 핸들러가 예외를 포착하지 못하게 하는 다른 상황이 없기를 바랄 뿐입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top