This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: Globales Exception-Handling in WPF
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Wie in jeder anderen Anwendung, kann natürlich auch in einer WPF-Applikation der Fehlerteufel stecken. Werden etwaige Fehlverhalten nicht abgefangen, kommt es zu ungewollten Abstürzen, die nicht nur beim Endkunden/-benutzer nur sehr unwillig aufgenommen werden. es gilt also, sämtliche Fehler abzufangen.
Grundsätzlich gibt es beim Exception-Handling keine Unterschiede zum Windows-Forms-Pendant, da es sich ja um eine Funktionalität des Frameworks handelt. Wobei es jedoch einen Unterschied gibt, ist das globale Abfangen von Fehlern.
Implementierung
Hat man bei einer Windows-Forms-Anwendung einen try-catch-Block um den Aufruf des Hauptfensters gelegt, steht in der Windows Presentation Foundation das Event DispatcherUnhandledException zur Verfügung. Hier stehen nun zwei Wege zur Verfügung, wie der dazu notwendige Eventhandler gesetzt werden kann.
Die erste Variante besteht in der Deklaration in der App.xaml, wie folgt:
Weiters kann das Event, wie unter Windows Forms, direkt per Code abonniert werden:
publicpartialclass App : Application
{
public App()
{
this.DispatcherUnhandledException +=
new DispatcherUnhandledExceptionEventHandler(
App_DispatcherUnhandledException);
}
}
Schlussendlich muss noch der Eventhandler selbst implementiert werden, welcher in diesem kleinen Beispiel lediglich eine MessageBox mit der Exception-Message ausgibt. An dieser Stelle wäre es durchaus sinnvoll, die nicht behandelten Exceptions in eine Log-Datei mitzuschreiben um später die Möglichkeit einer Auswertung zu haben.
Durch das Setzen der Eigenschaft Handled wird festgesetzt, dass WPF diese Exception nicht weiter behandelt, da dies bereits innerhalb des Handlers vorgenommen wurde.
Wichtige Hinweise
Durch das Event DispatcherUnhandledException werden alle unbehandelte Ausnahmen gemeldet, welche im Thread des User Interfaces laufen. Treten Fehler beispielsweise innerhalb eines Background Workers auf, gibt es darüber keine Benachrichtigung über DispatcherUnhandledException. In diesen Fällen müssen Sie sich selbst darum kümmern, in dem entweder eigene Fehlerbehandlungsroutinen geschrieben werden, diese Exceptions an den Haupt-UI-Thread übergeben werden bzw. diese im Haupt-UI-Thread nochmals werfen, ohne sie direkt zu behandeln. Auch in diesem Fall wird diese Exception dann über das Event DispatcherUnhandledException gemeldet.
Durch den Parameter DispatcherUnhandledExceptionEventArgs wird zum einen die geworfene Exception überreicht und weiters der Dispatcher, von dem aus die Exception geworfen wurde. Durch die Angabe der Exception kann nun auch überprüft werden, ob dieser Fehler überhaupt behebbar ist oder nicht. Nicht behebbar wäre beispielsweise eine StackOverflowException.
Fazit
Fehlerbehandlung ist ein absolut wichtiges Konzept, um den Benutzer vor Fehlern zu schützen und ein ungewolltes Beenden einer Anwendung zu verhindern. Verwenden Sie diese Methode, um alle behebbaren Exceptions abzufangen, die in ihrer Anwendung nicht behandelt werden. Achten Sie jedoch explizit auf Fehler, die in unterschiedlichen Threads auftreten.