2011-01-07 2 views
3

가벼운 WPF MVVM 프레임 워크를 개발 중이며 처리되지 않은 예외를 잡아 내고 이상적으로 복구 할 수 있기를 원합니다.프레임 워크 수준의 WPF 예외 캐치

나는 다음과 같은 상황이 발생,이 일을하지 않는 순간을 위해 모든 좋은 인수를 무시 : 나는 App.xaml.cs를의 OnStartup 메서드 내에서 AppDomain.CurrentDomain.UnhandledException 핸들러를 등록하면

을, 다음과 같이 ...

App.xaml.cs를 예상대로

protected override void OnStartup(StartupEventArgs e) 
{ 
    AppDomain.CurrentDomain.UnhandledException += new 
    UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler); 

    base.OnStartup(e); 
} 


void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea) 
{ 
    Exception e = (Exception)ea.ExceptionObject; 
    // log exception 
} 

다음 내 VM의 중 하나에 예외를 발생, 핸들러가 호출됩니다.

이 방법을 사용하여 복구 할 수있는 방법이 없다는 것을 제외하면 지금까지는 예외를 기록한 다음 CLR이 앱을 종료하도록 할 수 있습니다.

실제로 원하는 것은 복구하고 메인 프레임 워크 VM에 제어권을 반환하는 것입니다. (다시이 일에 반대하는 동기를 제쳐두고).

그래서, 약간의 독서를하고, 나는 코드가 지금과 같이 보입니다 있도록 문제가

protected override void OnStartup(StartupEventArgs e) 
{ 
    AppDomain.CurrentDomain.UnhandledException += 
    new UnhandledExceptionEventHandler(this.AppDomainUnhandledExceptionHandler); 

    this.DispatcherUnhandledException += 
    new DispatcherUnhandledExceptionEventHandler(DispatcherUnhandledExceptionHandler); 

    base.OnStartup(e); 
} 

void AppDomainUnhandledExceptionHandler(object sender, UnhandledExceptionEventArgs ea) 
{ 
    Exception e = (Exception)ea.ExceptionObject; 
    // log exception 
} 

void DispatcherUnhandledExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs args) 
{ 
    args.Handled = true; 
    // implement recovery 
} 

..., 같은 장소에 AppDomain.CurrentDomain.UnhandledException에 대한 이벤트 핸들러를 등록하기로 결정 일단 this.DispatcherUnhandledException에 대한 핸들러를 등록하면 이벤트 핸들러가 호출되지 않습니다. 그래서 DispatcherUnhandledExceptionHandler를 등록하면 어떻게 든 AppDomain.CurrentDomain.UnhandledException에 대한 핸들러가 비활성화됩니다.

누구든지 처리되지 않은 VM 예외를 포착하고 복구하는 방법이 있습니까?

프레임 워크에서 스레딩을 명시 적으로 사용하지 않을 수도 있습니다.

답변

5

이유 VS는 예외적으로 설정했기 때문에 (이 작업을 명시 적으로 수행했는지 또는 더 많은 경우 - 이와 같이 구성된 VS의 기본값) 설정했기 때문입니다. Debug->Exceptions 메뉴를 통해 디버깅 된 코드에서 예외가 발생할 때 Visual Studio의 기능을 제어 할 수 있습니다.

캐치가 있어도 쉽게 깨질 수 있습니다. 어떤 경우에는 매우 편리합니다.

멀티 스레딩을 사용하지 않는 경우 DispatcherUnhandledException 이벤트가 정상적으로 처리되어야합니다. 메인 UI 스레드에서 잡히지 않는 모든 것을 잡아낼 수 있기 때문입니다.

+0

감사합니다 Isak, 나는 내가 생성 할 가능성이있는 모든 예외를 잡는 것이 중요하다는 것을 아는 것이 중요합니다. –

2

내 자신의 질문에 대한 신속한 답변 :

이 작동 ...

App.xaml.cs를 :

protected override void OnStartup(StartupEventArgs e) 
{ 
    Application.Current.DispatcherUnhandledException += 
    new DispatcherUnhandledExceptionEventHandler(DispatcherUnhandledExceptionHandler); 

    base.OnStartup(e); 
} 

void DispatcherUnhandledExceptionHandler(object sender, DispatcherUnhandledExceptionEventArgs args) 
{ 
    args.Handled = true; 
    // implement recovery 
    // execution will now continue... 
} 

[편집 : 내 의견은 아래의 구현에 아무것도 ,하지만 내 특정 IDE를 (비주얼 스튜디오) IDE를 잡는 예외에 관한 설정. 위의 Isak의 의견을 참조하십시오.]

그러나 VisualStudio 내에서 실행하는 경우 VS 예외 알림 대화 상자가 표시되고 F5 키를 누르면 DispatcherUnhandledExceptionHandler가 호출됩니다. 그 후에 실행은 정상적으로 계속됩니다.

컴파일 된 바이너리를 명령 줄 또는 Windows 탐색기에서 직접 실행하는 경우 중개 팝업없이 예상대로 처리기가 호출됩니다.

관련 문제