This article has been localized into Czech by the community.
Ř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();
}
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 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.Error);
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.