TOC

This article has been localized into German by the community.

Eine WPF-Applikation:

Ausnahmebehandlung in WPF

Wenn du mit C# oder einer anderen .NET Sprache vertraut bist, mit der du WPF nutzt, sollte dir die Ausnahmebehandlung nicht neu sein: Wann auch immer du Code hast, der eine Ausnahme auslösen könnte, solltest du diesen in einem try-catch-Block umschließen. In diesem Block kannst du nun die Ausnahme auffangen und behandeln. Beachte folgendes Beispiel:

private void Button_Click(object sender, RoutedEventArgs e)
{
	string s = null;
	s.Trim();
}

Natürlich wird dies fehlschlagen, weil ich versuche die Trim()-Methode auf eine Variable anzuwenden, die aktuell null ist. Wenn du diese Exception nicht behandelst, dann wird deine Applikation abstürzen und Windows muss mit dem Problem umgehen. Wie du sehen kannst, ist dies nicht sehr benutzerfreundlich.

In diesem Fall würde der Benutzer gezwungen werden, die Applikation zu schliessen, aufgrund eines solch simplen und einfach zu verhindernden Fehlers. Also, wenn du weisst, dass möglicherweise etwas fehlschlagen könnte, dann solltest du einen try-catch-block benutzern, und zwar so:

private void Button_Click(object sender, RoutedEventArgs e)
{
	string s = null;
	try
	{
		s.Trim();
	}
	catch(Exception ex)
	{
		MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
	}
}

Aber manchmal kann auch der einfachste Code eine Exception werfen und anstatt jede einzelne Zeile Code in ein try-catch-Block zu verpacken, lässt dich WPF alle unbehandelten Exceptions global behandeln. Dies wird gemacht mittels dem DispatcherUnhandledException-Event auf der Application-Klasse. Wenn dieses Event abonniert ist wird WPF die Abonnement-Methode aufrufen, sobald eine Exception geworfen wird, welche nicht im Code behandelt wird. Hier ist ein komplettes Beispiel, basierend auf dem, was wir bereits behandelt haben:

<Window x:Class="WpfTutorialSamples.WPF_Application.ExceptionHandlingSample"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="ExceptionHandlingSample" Height="200" Width="200">
    <Grid>
        <Button HorizontalAlignment="Center" VerticalAlignment="Center" Click="Button_Click">
            Do something bad!
        </Button>
    </Grid>
</Window>
using System;
using System.Windows;

namespace WpfTutorialSamples.WPF_Application
{
	public partial class ExceptionHandlingSample : Window
	{
		public ExceptionHandlingSample()
		{
			InitializeComponent();
		}

		private void Button_Click(object sender, RoutedEventArgs e)
		{
			string s = null;
			try
			{
				s.Trim();
			}
			catch(Exception ex)
			{
				MessageBox.Show("A handled exception just occurred: " + ex.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Warning);
			}
			s.Trim();
		}
	}
}

Merke, dass ich die Trim()-Methode ein zusätzliches Mal aufrufe, ausserhalb des try-catch-Blocks, damit der erste Aufruf behandelt wird, aber der zweite nicht. Für den zweiten Aufruf brauchen wir die App.xaml-Magie:

<Application x:Class="WpfTutorialSamples.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             DispatcherUnhandledException="Application_DispatcherUnhandledException"
             StartupUri="WPF Application/ExceptionHandlingSample.xaml">
    <Application.Resources>
    </Application.Resources>
</Application>
using System;
using System.Windows;

namespace WpfTutorialSamples
{
	public partial class App : Application
	{
		private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
		{
			MessageBox.Show("An unhandled exception just occurred: " + e.Exception.Message, "Exception Sample", MessageBoxButton.OK, MessageBoxImage.Error);
			e.Handled = true;
		}
	}
}

Wir behandeln diese Ausnahme (Exception) relativ identisch zu der lokalen, nur mit einem leicht abgeänderten Text und anderem Symbol im Nachrichten-Fenster. Merke auch, das ich die e.Handled-Eigenschaft auf true (wahr) setze. Dies teilt WPF mit, dass wir mit der Behandlung der Ausnahme fertig sind und diesbezüglich nichts weiter unternommen werden soll.

Zusammenfassung

Exception-Handling ist ein sehr wichtiger Teil jeder Applikation und glücklicherweise machen es WPF und .NET sehr einfach Exceptions sowohl lokal als auch global zu behandeln. Du solltest Exceptions lokal behandeln, wo es Sinn macht und global nur als Notfall-Mechanismus, weil lokales Behandeln dir erlaubt, viel spezifischer zu reagieren.


This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!