The Artima Developer Community
Sponsored Link

.NET Buzz Forum
Globales Exception-Handling in WPF

0 replies on 1 page.

Welcome Guest
  Sign In

Go back to the topic listing  Back to Topic List Click to reply to this topic  Reply to this Topic Click to search messages in this forum  Search Forum Click for a threaded view of the topic  Threaded View   
Previous Topic   Next Topic
Flat View: This topic has 0 replies on 1 page
-

Posts: 1524
Nickname: nitronic
Registered: Jul, 2006

Norbert Eder works as a software architect.
Globales Exception-Handling in WPF Posted: Jan 22, 2008 6:55 AM
Reply to this message Reply

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
Latest .NET Buzz Posts
Latest .NET Buzz Posts by -
Latest Posts From Norbert Eder - Living .NET

Advertisement
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:
<Application x:Class="WpfExceptionDemo.App"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    StartupUri="Window1.xaml" 
    DispatcherUnhandledException="App_DispatcherUnhandledException">
    <Application.Resources>
         
    </Application.Resources>
</Application>

Weiters kann das Event, wie unter Windows Forms, direkt per Code abonniert werden:
public partial class 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.
void App_DispatcherUnhandledException(
    object sender, 
    DispatcherUnhandledExceptionEventArgs e)
{
    MessageBox.Show(
        String.Format("An error occured: {0}", e.Exception.Message), 
            "Error");
    e.Handled = true;
}

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.

Read: Globales Exception-Handling in WPF

Topic: Debugging into .NET Framework Source Code Previous Topic   Next Topic Topic: WPF: x:Code Element - eine Diskussion

Sponsored Links



Google
  Web Artima.com   

Copyright © 1996-2019 Artima, Inc. All Rights Reserved. - Privacy Policy - Terms of Use