381 Stimmen

WPF global exception handler

Manchmal, unter nicht reproduzierbaren Umständen, stürzt meine WPF-Anwendung ohne Meldung ab. Die Anwendung einfach sofort schließen.

Wo ist der beste Ort, um den globalen Try/Catch-Block zu implementieren? Zumindest muss ich eine Messagebox mit implementieren: "Sorry for the inconvenience ..."

11voto

Tobias Hoefer Punkte 985

Ergänzend zu den oben genannten Beiträgen:

Application.Current.DispatcherUnhandledException

fängt keine Ausnahmen ab, die von einem anderen Thread als dem Hauptthread ausgelöst werden. Sie müssen diese Ausnahmen in demselben Thread abfangen, in dem sie ausgelöst werden. Wenn Sie sie jedoch in Ihrem globalen Exception-Handler behandeln wollen, können Sie ihn an den Hauptthread übergeben:

 System.Threading.Thread t = new System.Threading.Thread(() =>
    {
        try
        {
            ...
            //this exception will not be catched by 
            //Application.DispatcherUnhandledException
            throw new Exception("huh..");
            ...
        }
        catch (Exception ex)
        {
            //But we can handle it in the throwing thread
            //and pass it to the main thread wehre Application.
            //DispatcherUnhandledException can handle it
            System.Windows.Application.Current.Dispatcher.Invoke(
                System.Windows.Threading.DispatcherPriority.Normal,
                new Action<Exception>((exc) =>
                    {
                      throw new Exception("Exception from another Thread", exc);
                    }), ex);
        }
    });

3voto

dustyburwell Punkte 5705

Um die Antwort von Thomas zu ergänzen, wird die Application Klasse hat auch die DispatcherUnhandledException Ereignis, das Sie bewältigen können.

3voto

karpanai Punkte 235

Eine vollständige Lösung ist aquí

es ist sehr schön mit Beispielcode erklärt. Achten Sie jedoch darauf, dass die Anwendung nicht geschlossen wird, und fügen Sie die Zeile Application.Current.Shutdown(); ein, um die Anwendung ordnungsgemäß zu schließen.

2voto

Jens Punkte 1967

Wie oben erwähnt

Application.Current.DispatcherUnhandledException fängt keine Ausnahmen, die von einem anderen Thread als dem Hauptthread ausgelöst werden.

Das hängt tatsächlich davon ab, wie das Thema erstellt wurde

Ein Fall, der nicht von Application.Current.DispatcherUnhandledException behandelt wird, ist System.Windows.Forms.Timer, für den Application.ThreadException verwendet werden kann, um diese zu behandeln Wenn Sie Forms auf anderen Threads als dem Hauptthread ausführen, müssen Sie Application.ThreadException von jedem dieser Threads aus setzen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X