2016-07-19 2 views
2

처리되지 않은 예외 이벤트에 대한 처리기를 작성합니다.이 예외 처리기는 파일에 예외를 덤프 한 다음 추가 분석을 위해 서버로 보냅니다. 현재로서는 충돌이 발생했음을 보여줄 것입니다. 나는 그 행사에 구독했다. 이 방법에서는 오류 처리 기능을 호출했습니다. 나는이 방법이 코드를 썼다 그러나 : 디버그 모드에서Universal Apps의 처리되지 않은 예외 처리기의 비동기 메서드

public async Task HandleException(Exception exception) 
{ 
    var dialog = new MessageDialog(exception.Message, "Exception occurred"); 
    await dialog.ShowAsync(); 
} 

하고 실행을 Visual Studio에서 Visual Studio를 적시에 디버거를 보여줍니다. 처음에는 GUI 스레드가 죽어 가고있을 때 Message Box를 표시하려고하는 것이 문제라고 생각했습니다. 기능 FileStorage.WriteToFileAsync의 모습

public async Task HandleManagedException(Exception 
{ 
    await FileStorage.WriteToFileAsync("someFile.txt", exception.ToString()); 
} 

: 나는 await FileIO.WriteTextAsync(file,data)에 중단 점을 넣을 때, 디버거 모드에서

public async Task WriteToFileAsync(string filename, string data) 
{ 
    var file = await this.storageFolder.CreateFileAsync(filename, CreationCollisionOption.ReplaceExisting); 
    await FileIO.WriteTextAsync(file, data); 
} 

이 거기 중지 내가 할 수있는 기능을 변경했습니다. 계속 버튼을 누르면 앞의 코드와 같은 창이 나타납니다. XAML 이벤트에서 호출 될 때 제대로 실행됩니다. 처리되지 않은 예외 처리기에서 비동기 메서드에 대한 Google 및 StackOverflow를 검색했지만 내 문제와 관련이 없습니다.

내 질문은 다음과 같습니다. 오류의 원인은 무엇입니까? 처리되지 않은 예외 처리기에서 비동기 메서드를 사용할 수 있습니까?

업데이트 : 지금까지 답변 해 주셔서 감사합니다. 두 번째 질문은 코드를 자세히 디버깅 한 후에 나 자신에게 대답했습니다. 그것이 가능하고 함수가 의도 한대로 작동하고 있다는 것이 밝혀졌습니다.

+0

WriteToFileAsync ("someFile., exception.ToString());"코드를 읽으 실 수 있습니까? – BugFinder

+0

예, 'FileTime.WriteTextAsync (file, data);를 기다리고 있습니다.', 디버거를 실행하고 거기서 멈추었습니다. –

+0

잘 못 견적으로 - 거기에 문제가있는 것 같습니다 – BugFinder

답변

3

적시에 디버거 대화 상자는 Visual Studio를 방지하기 위해, 우리는 다음과 같이 trueUnhandledExceptionEventArgs.Handled 속성을 설정할 수 있습니다 :

디버그 모드에서
public App() 
{ 
    this.InitializeComponent(); 
    this.Suspending += OnSuspending; 
    this.UnhandledException += App_UnhandledException; 
} 

private async void App_UnhandledException(object sender, UnhandledExceptionEventArgs e) 
{ 
    e.Handled = true; 
    await HandleException(e.Exception); 
} 

public async Task HandleException(Exception exception) 
{ 
    var dialog = new MessageDialog(exception.Message, "Exception occurred"); 
    await dialog.ShowAsync(); 
} 

, 당신은 경고를 얻을 적시에 디버거 대화 App.gics에서 다음과 같은 코드가 있기 때문에 우리가 프로젝트를 빌드 할 때

#if DEBUG && !DISABLE_XAML_GENERATED_BREAK_ON_UNHANDLED_EXCEPTION 
UnhandledException += (sender, e) => 
{ 
    if (global::System.Diagnostics.Debugger.IsAttached) 
     global::System.Diagnostics.Debugger.Break(); 
}; 
#endif 

이러한 코드는 자동으로 생성됩니다. 그리고이 코드에서 디버그 모델에서 처리되지 않은 예외가있는 경우 Debugger.Break Method을 호출하면 경고 및 Just-In-Time Debugger 대화 상자가 표시됩니다.

처리기에서 e.Handled = true;으로 설정하면이 문제를 방지 할 수 있습니다. 더 많은 정보를 원하면이 비슷한 질문 인 How to try/catch all exceptions을 확인하십시오. 그러나 이것이 디버그 모드에서만 발생한다는 것을 알 수 있듯이 릴리스 모델에서는 코드가 잘 작동합니다.

+0

나는이 질문을 왜 우리가해야할 필요가 있다고 생각 하는가 ... 왜 WPF와 같은 디버그가 아닌가 lol –

+0

해당 속성을 확인하고 작동합니다. 그러나 처리되지 않은 예외 및 해당 대화 상자 표시 후 응용 프로그램을 종료하는 것이 좋습니다. 팝업을 표시하지 않는 다른 방법이 있습니까? –

+0

@MaxiKing 다른 방법이 없습니다. 이러한 코드는 자동으로 생성되며 처리되지 않은 예외를 디버깅하는 데 사용됩니다. 일반적으로 처리되지 않은 예외가 발생하면 Visual Studio에서이 메서드가 중단되어 예외 정보 양식 인 e 매개 변수를 가져올 수 있습니다. 이 경우 디버그를 중단하고이 예외를 처리해야합니다. 그리고 말했듯이, 이것은 릴리스 모드에서 디버그 모드에서만 발생합니다. Windows 런타임은 처리되지 않은 예외 후에 응용 프로그램을 종료하고 대화 상자가 표시되지 않습니다. –