This article has been localized into Slovak by the community.
Manipulácia s výnimkami vo WPF
Ak ste oboznámení s jazykom C#, alebo s niektorým z iných jazykov .NET, ktorý sa používa s WPF, manipulácia s výnimkami by nemala byť pre vás nová: Keď máte časť kódu, kde pravdepodobne nastane výnimka, potom by ste ju mali zabaliť do bloku try-catch, aby ste obslúžili túto výnimku elegantne. Napríklad, zvážte tento príklad:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Samozrejme, že nastane chyba programu, pretože sa pokúšame vykonať metódu Trim() na premennej, ktorá je momentálne nulová. Ak nezachytíte výnimku, váša aplikácia sa zrúti a Windows bude musieť riešiť tento problém. Ako vidíte, to nie je užívateľsky veľmi prívetivé:
V takomto prípade by užívateľ musel zavrieť vašu aplikáciu kvôli takejto jednoduchej chybe, ktorej sa dá ľahko vyhnúť. Takže ak viete, že by mohla nastať výnimka, potom by ste mali použiť blok try-catch, ako je to tu:
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);
}
}
Avšak niekedy dokonca aj najjednoduchší kód môže priniesť výnimku a namiesto zabalenia každého jednotlivého riadku blokom try- catch vám WPF umožní zvládnuť všetky neošetrené výnimky globálne. To sa deje pomocou udalosti DispatcherUnhandledException v triede Aplikácia. WPF zavolá metódu prihlásenia, akonáhle vznikne výnimka, ktorá nie je spracovaná vo vašom vlastnom kóde. Tu je kompletný príklad založený na tom čo sme práve preberali:
<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šimnite si, že metódu Trim() voláme druhý krát mimo bloku try-catch, takže prvé volanie je spracované, zatiaľ čo druhé nie je. Pre to druhé potrebujeme kúzlo 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;
}
}
}
Ošetríme výnimku podobne ako tú lokálnu, ale s mierne odlišným textom a obrázkom v message boxe. Tiež si všimnite, že sme nastavili vlastnosť e.Handled na true. Toto hovorí WPF, že sme sa už zaoberali touto výnimkou a nič by sa s tým nemalo robiť.
Zhrnutie
Ošetrovanie výnimiek je veľmi dôležitou súčasťou akejkoľvek aplikácie a našťastie WPF a .NET veľmi ľahko zvládajú výnimky lokálne aj globálne. Mali by ste riešiť výnimky lokálne, keď to dáva zmysel, a globálnu manipuláciu používať len ako rezervný mechanizmus, pretože lokálne ošetrenie umožňuje, aby ste boli konkrétnejší a vyriešili problém špecializovanejším spôsobom.