TOC

This article has been localized into Hungarian by the community.

Egy WPF alkalmazás:

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.


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!