TOC

This article has been localized into Czech by the community.

WPF aplikace:

Řešení výjimek ve WPF

Znáte-li jazyk C#, nebo jakýkoliv jiný jazyk pro .NET, který umožňuje práci s WPF, pak by pro vás nemělo být zpracování výjimek nic nového: Kdykoliv máte část kódu, která by mohla vyvolat nějakou výjimku, měli byste ji obalit try-catch blokem, aby bylo možné ji zachytit a vyřešit. Uvažujme následující příklad:

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

Pochopitelně zde dojde k chybě, neboť se pokoušíme zavolat metodu Trim() na proměnné, která je nastavena na null. Neošetříte-li výjimku, aplikace spadne a o problém se bude muset postarat Windows. Jak můžete vidět, není to právě uživatelsky přívětivé řešení:

Uživatel je zde donucen zavřít aplikaci, a to jen kvůli triviální a snadno ošetřitelné chybě, jako je tato. Víte-li, že by mohla obdobná situace nastat, měli byste použít try-catch blok, abyste vyjímečnou situaci ošetřili:

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 však může i ten nejjednodušší kód vyhodit výjimku, a namísto toho, abyste každou řádku obalovali try-catch blokem, nabízí WPF způsob, jak ošetřit všechny neošetřené výjimky globálně. Toho lze docílit obsloužením události DispatcherUnhandledException na třídě Application. WPF zavolá obslužnou metodu této události ve chvíli, kdy je vyhozena výjimka, která nebyla ošetřena v rámci kódu aplikace. Následující příklad zcela ilustruje vše, co jsme nyní probrali:

<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 se metoda Trim() zavolá podruhé, avšak už mimo try-catch blok - takže první volání je ošetřeno, druhé již ne. Pro ošetření druhého volání potřebujeme obsluhu v 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!