2016-07-19 3 views
2

Ich schreibe Handler für Unhandled Exception Ereignis, das wir eine Ausnahme in eine Datei ausgeben und dann an einen Server zur weiteren Analyse senden. Für jetzt wird es nur zeigen, dass ein Crash passiert ist. Ich habe die Veranstaltung abonniert. In dieser Methode habe ich eine Funktion zur Fehlerbehandlung aufgerufen. Allerdings, wenn ich in der Methode diesen Code schrieb:Asynchrone Methoden in unbehandeltem Ausnahmehandler in Universal Apps

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

und es im Debug-Modus läuft das Visual Studio zeigt Visual Studio Just-In-Time-Debugger. An erster Stelle dachte ich, es wäre das Problem, dass ich versuche, die Message Box zu zeigen, wenn der GUI-Thread abstürzt. Ich habe die Funktion zu:

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

wo Funktion FileStorage.WriteToFileAsync wie folgt aussieht:

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

Im Debugger-Modus, wenn ich Haltepunkt auf await FileIO.WriteTextAsync(file,data) es bleibt dort stehen. Nach dem Drücken der Fortfahren-Taste erscheint das gleiche Fenster wie im vorherigen Code. Es wird ordnungsgemäß ausgeführt, wenn es von XAML-Ereignissen aufgerufen wird. Ich habe google und StackOverflow nach den asynchronen Methoden im unbehandelten Exception-Handler gesucht, aber es gab nichts, was mein Problem betraf.

Meine Fragen sind: Was ist der Grund für diesen Fehler? Ist es möglich, asynchrone Methoden im Unhandled Exception Handler zu verwenden?

Update: Vielen Dank für die Antworten bisher. Die zweite Frage beantwortete ich selbst nach dem Debuggen des Codes. Es stellte sich heraus, dass es möglich ist und die Funktion wie vorgesehen funktioniert.

+0

Sind Sie sicher, dass Ihr Code WriteToFileAsync ("someFile., Exception.ToString()); ?? – BugFinder

+0

Ja, ich bin sicher, weil ich einen Haltepunkt auf 'warten FileIO.WriteTextAsync (Datei, Daten);', Debugger läuft und dort gestoppt –

+0

und da ein Zitat fehlt - es scheint, dass Sie ein Problem dort haben – BugFinder

Antwort

3

das Visual Studio Just-In-Time-Debugger Dialog zu vermeiden, können wir UnhandledExceptionEventArgs.Handled Eigenschaft auf true wie folgt festgelegt:

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(); 
} 

Im Debug-Modus, können Sie die Warnung erhalten und Just-In-Time-Debugger Dialog weil es folgende Codes in App.gics sind:

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

Diese Codes werden automatisch generiert, wenn wir das Projekt. Und von diesen Codes aus können wir feststellen, dass im debug-Modell, wenn eine unbehandelte Ausnahme vorliegt, Debugger.Break Method aufgerufen wird und dies zum Dialogfeld "Warnung und Just-In-Time-Debugger" führt.

Einstellung e.Handled = true; in unserem Handler kann dies vermeiden. Für weitere Informationen können Sie diese ähnliche Frage überprüfen: How to try/catch all exceptions. Wie Sie jedoch sehen können, wird dies nur im Debug-Modus passieren. Im Release-Modell sollte Ihr Code gut funktionieren.

+0

Ich denke die Frage ist, warum müssen wir das überhaupt tun ... Warum debuggt dies nicht wie WPF lol –

+0

ich überprüft diese Eigenschaft und es funktioniert. Ich würde es jedoch vorziehen, die Anwendung nach unbehandelter Ausnahme zu beenden und diesen Dialog nicht anzuzeigen. Gibt es andere Methoden, das Popup nicht anzuzeigen? –

+0

@MaxiKing Ich fürchte, es gibt keinen anderen Weg. Diese Codes werden automatisch generiert und helfen uns, unbehandelte Ausnahmen zu debuggen. Wenn wir auf eine unbehandelte Ausnahme stoßen, bricht Visual Studio diese Methode normalerweise ab, und wir können die Ausnahmeinformationen aus 'e' abrufen. In dieser Situation sollten wir das Debuggen stoppen und mit dieser Ausnahme umgehen. Und wie ich gesagt habe, wird dies nur im Debug-Modus passieren, im Release-Modus wird die Windows-Runtime Ihre Anwendung nach unbehandelter Ausnahme beenden und es wird keinen Dialog geben. –

Verwandte Themen