TOC

This article has been localized into Czech by the community.

WPF aplikace:

Řešení výjimek ve WPF

Pokud jste obeznámeni s jazykem C# nebo jakýmkoliv jiným .NET jazykem, který umožňuje používat WPF, pak by pro vás nemělo být řešení výjimek nic nového: Kdykoliv máte kus kódu, u něhož je pravděpodobné, že vyhodí výjimku, měli byste ho obalit try-catch blokem pro její elegantní řešení. Uvažujme tento příklad:

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

Samozřejmě dojde k chybě, neboť se pokoušíme zavolat metodu Trim() na proměnné, která je nastavena na null. Pokud nebude výjimka ošetřena, aplikace spadne a Windows se budou muset vypořádat se vzniklým problémem. Je jasné, že toto není úplně uživatelsky nejpřívětivější řešení:

V tomto případě je uživatel donucen zavřít aplikaci kvůli takovéto triviální a snadno ošetřitelné výjimce. Pokud tedy víte, že by mohla nastat podobná situace, měli byste takto nějak použít try-catch blok:

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

Někdy ovšem i ten nejjednodušší kód může vyhodit výjimku a místo toho, abyste museli obalovat každou řádku try-catch blokem, WPF nabízí možnost ošetřit všechny neošetřené výjimky globálně. Tohoto globálního ošetření lze docílit přes událost DispatcherUnhandledException na třídě Application. Pokud třída na tuto událost reaguje, WPF zavolá reagující metodu v momentě kdy by byla vyhozena neodchycená výjimka ve vašem kódu. Zde je kompletní příklad znázorňující principy, které jsme právě prošly:

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

Všimněte si, že metoda Trim() se volá ještě jednou mimo try-catch blok, takže její první volání je sice ošetřeno, druhé ovšem ne. Pro ošetření druhého volání potřebujeme magii App.xaml:

<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.Warning);
			e.Handled = true;
		}
	}
}

Globálně odchycenou výjimku ošetřujeme podobně jako tu lokální ovšem s trochu odlišným textem a obrázkem v okně se zprávou. Také si všimněte, že vlastnost e.Handled je nastavená na true. Toto nastavení říká WPF, že už jsme danou výjimku vyřešili a není ohledně ní už nic dalšího potřeba udělat.

Shrnutí

Řešení výjimek je velmi podstatná část jakékoliv aplikace a WPF a .NET ji naštěstí usnadňují ať už lokálně nebo globálně. Výjimky by měly být ošetřovány lokálně, když to dává smysl. Globální řešení by mělo sloužit pouze jako nouzový mechanismus, neboť lokální řešení dovoluje mnohem specifičtější zpětnou vazbu a specializovanější řešení vzniklého problému.

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!