2

내가 probabily 매우 간단 뭔가를 부탁 해요,하지만 난 여기에 뭔가 놓친 거지 확신합니다 : DApplication_UnhandledException을 사용하여 일반적인 예외를 잡는 방법?

을 내가 가지고 내 App.xaml.cs를 파일에 다음과 같은 방법

private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e) 
{ 
    MessageBox.Show("An error occurred!", ":(", MessageBoxButton.OK); 
    e.Handled = true; 
    App.Current.Terminate; 
} 

그리고 이벤트 핸들러는 앱에 추가됩니다() 메소드 :

을 : 이제

public App() 
{ 
    UnhandledException += Application_UnhandledException; 

    //InitializeComponent() etc... 
} 

, 내가 좋아하는 내 MainPage.xaml.cs를 파일에 내 방법 중 하나에 IndexOutOfRange 예외를 생성하는 라인의 몇 뭔가를 추가

int[] stuff = new int[3]; 
for (int i = 0; i < 4; i++) 
{ 
    stuff[i] = 0; 
} 

Application_UnhandledException 메서드가 어떻게 작동하는지 이해할 수 없습니다. 실행하려고하면 Visual Studio 디버거에서 IndexOutOfRange 예외가 발생하지만 응용 프로그램이 충돌하고 해당 메시지 상자가 표시되지 않습니다. , Application_UnhandledException 내의 코드는 전혀 실행되지 않습니다. 왜 그럴까요?

어떤 예외가 발생하더라도 트리거하는 이벤트 처리기를 추가하는 방법이 있습니까? KeyNotFound와 함께 IndexOutOfRande를 사용하면 ...

고마워! :) 소집 그것을 연결된 documentation에서

+0

코드 주위에서 try/catch를 래핑하고 catch에서 다시 던지면 어떻게됩니까? 예외. –

+0

아무 일도 일어나지 않습니다. 동일한 IndexOutOfRange Exception을 얻고 Application_UnhandledException이 트리거되지 않습니다. – Sergio0694

+0

코드가 비동기 함수에 포함되어 있습니까? –

답변

0

이 (가) 다음과 같은 말씀하시기 UnhandledException 이벤트가 해고 된 후 예외가 처리되지 않은 때문에

는 일반적으로 윈도우 런타임 응용 프로그램을 종료합니다. 앱 코드가 이에 대해 제어 할 수 있습니다. UnhandledException 이벤트 처리기가 이벤트 인수의 Handled 속성을 true로 설정하면 대부분 인 앱이 종료되지 않습니다. 그러나 일상적으로 여러 가지 이유로 권장하지 않습니다 그래서 일 :

는 일반적으로 UnhandledException 이벤트 핸들러는 에 충분한 정보를 가지고 있지 않은 예외 후에 계속하는 것이 안전한지 알고있다. 응용 프로그램 코드 또는 Windows 런타임의 일부가 일치하지 않는 상태 일 수 있습니다. 응용 프로그램이 코드를 실행하는 경우 계속 실패 할 수 있습니다. 윈도우 런타임 •

예외를 고려 복구 할 수없는 등의 특정 작업을 수행하는 동안 발생의 Windows 런타임 자체가 이러한 예외를 다음과 같은 일관성없는 상태에있을 것입니다 때문입니다. 이러한 예외의 경우 UnhandledException 이벤트 처리기가 Handled를 true로 설정하더라도 응용 프로그램은 여전히 ​​종료됩니다.

• 탐색하는 동안 오류가 발생하면 콘텐츠가로드되지 않고 사용자에게 앱이 아직 실행 중임을 나타내지 않는 상태가 발생할 수 있습니다.

+0

디버거가 연결된 상태로 실행중인 경우 UnhandledException 이벤트가 발생하지 않을 때까지 응용 프로그램의 실행을 계속 진행해야합니다. Visual Studio 디버거에서 초기 알림을받은 후. –

1

메시지 상자는 응용 프로그램을 바로 종료하기 때문에 표시되지 않습니다.위에서 언급 한 바와 같이

e.Handled = true; 

그러나, 응용 프로그램 실행을 계속하는 것이 더 문제가 발생할 수 있습니다 :이 동작을 중지 할 경우

, 당신은 코드 줄이 필요합니다. 그래서 나는 당신이 충돌 정보를 수집하고, 아마 사과를하고 어쨌든 앱을 종료하는 시나리오에서만 이것을 사용할 것입니다. App.Current.Terminate();

+0

메시지 상자 다음에 App.Current.Terminate()를 추가했지만 작동하지 않는다는 점은 전체 Application_UnhandledException 메서드가 트리거되지 않는다는 것입니다. IndexOutOfRange 예외로 시도하고 KeyNotFound 예외로 작동하지 않습니다. 내 말은, 어떤 종류의 Exception으로 트리거 할 수있는 이벤트 핸들러를 만들 수 있습니까? – Sergio0694

+0

이 메서드는 매번 호출해야합니다. 새 앱을 만들고 여기에서 예외를 만들려고 할 수 있습니까? – Filip

+0

나는 그것을 시도했지만 여전히 동일한 것을 얻는다 : Visual Studio는 IndexOutOfRange Exception을 얻었지만 Application_UnhandledException 메소드는 실행되지 않는다고 말한다. – Sergio0694

관련 문제