This article is currently in the process of being translated into Croatian (~93% done).
Handling exceptions in WPF
Ako poznajete C# ili bilo koji drugi .NET jezik koji se može koristiti s WPF-om, upravljanje iznimkama vam ne bi trebala biti neka novost: Kada god imate neki komad koda koji bi mogao baciti iznimku, trebali biste ga ubaciti unutar try-catch bloka kako biste rukovali iznimkom na ispravan način. Razmotrimo sljedeći primjer:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Iz primjera je vidljivo da će doći do greške jer pokušavam primijeniti Trim() metodu nad varijablom koja trenutno sadrži null. Ako ne rukujete iznimkama, vaša aplikacija će se srušiti i Windowsi će se morati nositi s problemom. Kao što vidite to nije baš prilagođeno korisniku:
U ovom slučaju, korisnik bi bio primoran ugasiti aplikaciju zbog jednostavne greške koja se lako mogla izbjeći. Tako da, ako znate da stvari mogu krenuti po zlu, onda biste trebali koristiti try-catch blok, poput ovog:
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);
}
}
Međutim, ponekad i najjednostavniji kod može baciti iznimku i kako ne bismo svaku liniju ubacivali u try-catch blok, WPF vam omogućava da rukujete svim neobrađenim iznimkama globalno. To se radi s pomoću DispatcherUnhandledException događaja u Application klasi. Ako se pretplatite na taj događaj, WPF će, kada dođe do greške koja nije obrađena, pozvati metodu s kojom ste se pretplatili. Ovo je potpuni primjer:
<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();
}
}
}
Primijetite da pozivam Trim() metodu još jednom, izvan try-catch bloka, tako da je prvi poziv obrađen, dok drugi nije. Za drugi poziv, potrebna nam je App.xaml čarolija:
<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;
}
}
}
Iznimkom rukujemo na sličan način kao i s lokalnom, ali s drugačijom porukom i slikom u okviru za poruke. Također primijetite da postavljam e.Handled svojstvo na true. To govori WPF-u da smo gotovi s obradom greške i da nije više potrebno ništa napraviti po tom pitanju.
Summary
Rukovanje iznimkama je jako važan dio bilo koje aplikacije i srećom, WPF i .NET čine rukovanje greškama, bilo lokalnim ili globalnim, jednostavnim. Trebali biste rukovati greškama lokalno kada to ima smisla i koristiti globalno rukovanje greškama kao rezervnu opciju. Lokalno upravljanje greškama vam omogućavate da budete konkretniji i da riješite problem na specijaliziraniji način.