This article has been localized into Hungarian by the community.
Kivételkezelés WPF-ben
Amennyiben ismeri a C# programnyelv, vagy egyéb .NET programnyelv szerkezetét ami alkalmas WPF környezetre, akkor a kivételkezelés nem lesz új az ön számára: Amikor olyan kódrészt szerkeszt, ami valószínűleg kivételt okozhat, akkor zárja be a kódrészt a szokásos try-catch tömbbe, a kivétel megfelelő kezelése érdekében. Példaként tekintsük meg az alábbi kód részletet:
private void Button_Click(object sender, RoutedEventArgs e)
{
string s = null;
s.Trim();
}
Magától értetődően hiba történik, mivel futtatni akarjuk a Trim() metódust olyan változón, mely az adott pillanatban nincs inicializálva. Ha nem kezeljük a kivételt, akkor az applikáció összeomlik és az operációs rendszer kell hogy kezelje a kivételt. Amint látjuk ez nem felhasználó barát megoldás:
Ebben az esetben a felhasználó kényszerítve van, hogy bezárja az alkalmazást, egy egyszerű és elkerülhető hiba miatt. Ha feltételezzük, hogy ilyen esetekben hiba történhet, akkor akkor alkalmaznunk kell a try-catch blokkot, mint az alábbi példában látható:
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);
}
}
Persze bizonyos esetekben még egy egyszerű kódrészlet is okozhat kivételt, és az helyett hogy minden egyes kisebb kódrészletet bezárnánk try- catch blokkba, a WPF lehetővé teszi hogy globálisan kezeljük a nem kezelt kivételeket. Ez a DispatcherUnhandledException eseményen keresztül valósul meg az Application osztályban. Ha bejelentkeztünk az adott kivétel kezelésre akkor a WPF hívja a kivétel kezelő metódust minden olyan esetre amikor kivétel fordul elő és az adott kivétel nincs kezelve a felhasználói programkódban. Itt látható a példa a fent ismertetett eljárásról:
<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();
}
}
}
Figyeljük meg hogy a Trim() metódus hívásra kerül extra időben, a try-catch blokkon kívül, és így az első kivétel kezelésre kerül, a második viszont nem. A második kezelésére az App.xaml file-ban apró trükköt kell alkalmaznunk:
<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;
}
}
}
Úgy kezeljük a kivételt mint ha lokálisan kezelnénk, csak más a szöveg és a kép a MessageBox üzenetben. Úgyszintén láthatjuk, hogy a e.Handled át lett állítva igaz értékre. Ez megmondja a WPF-nek, hogy lekezeltük a kivételt és egyéb akcióra nincs szükség.
Összegzés
A kivétel kezelés nagyon fontos része minden applikációnak, szerencsére a WPF és a .NET lehetővé teszi a kivételek egyszerű kezelését lokálisan és globálisan egyaránt. Kezeljük a kivételt lokálisan, persze ha van értelme, a globális kivétel kezelést csak szüneteltető funkcióként alkalmazzuk, mivel a lokális kivétel kezelés esetén sokkal körültekintőbben, az adott problémára összpontosítva tudjuk a problémát megoldani.