TOC

This article has been localized into Turkish by the community.

Bir WPF Uygulaması:

WPF'de İstisnai Olayları İşlemek

C# veya WPF ile kullanabileceğiniz diğer .NET dillerinden herhangi birine aşinaysanız istisna işleme sizin için yeni olmamalıdır. Hata vermesi muhtemel bir kod parçanız varsa bunu try-catch bloğu içine almanız hatanın nedeninin kullanıcıya güzel bir şekilde iletilmesi açısından önemlidir. Mesela şu örnekte olduğu gibi:

private void Button_Click(object sender, RoutedEventArgs e)
{
	string s = null;
	s.Trim();
}

Şu anki değeri null olan bir değişkene Trim() metodunu uygulamaya çalıştığımdan dolayı açıkçası bir hata oluşacaktır. Eğer hatayı (istisnayı) kendiniz işlemezseniz uygulama kapanacak ve Windows sorunu kendisi halletmeye çalışacaktır ve bunu da gördüğünüz gibi hiç kullanıcı dostu olmayan bir şekilde yapacaktır.

Bu durumda, kullanıcı, çok basit ve kolayca önlenebilen bir hata nedeniyle uygulamanızı kapatmaya zorlanır. Eğer işlerin kötüye gidebileceğini düşünüyorsanız o zaman şöyle bir try-catch bloğu kullanmalısınız:

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);
	}
}

Ancak, bazen en basit kod bile bir hata verebilir ve her bir kod satırını bir try-catch bloğu ile sarmak yerine, WPF tüm işlenmemiş istisnaları global olarak ele almanıza izin verir. Bu, Uygulama sınıfındaki DispatcherUnhandledException olayı aracılığıyla gerçekleştirilir. Kodunuz içerisinde bu olaya abone olunduğunda, WPF, kendi kodunuzda ele alınmayan bir hata/istisna oluştuğunda abone olunan metodu çalıştırır. Aşağıda şu ana kadar gördüğümüz konuyla ilgili tam bir örnek yer almaktadır:

<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();
		}
	}
}

Trim() metodunu, try-catch bloğunun dışında fazladan bir kere daha çağırdığımı, böylece ilk çağrının sorunsuz çalıştığını, ikincisinin hata verdiğine dikkat edin. İkincisi için, App.xaml dosyasında bir sihir yapacağız:

<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;
		}
	}
}

Mesaj kutucuğundaki az farklı bir metin ve resim dışında hatayı/istisnayı herhangi bir lokal hata/istisnası gibi ele alıyoruz. Ayrıca, "e.Handled" özelliğini "true" değerine ayarladığıma da dikkat edin. Bu WPF'ye bu hata/istisna ile ilgilendiğimizi ve bu konuda başka bir şey yapılmaması gerektiğini söyler.

Sonuç

Hata/istisna işleme konusu herhangi bir uygulamanın çok önemli bir parçasıdır. Neyse ki, WPF ve .NET, istisnaları hem özel (lokal) hem de genel (global) olarak ele almayı çok kolaylaştırmaktadır. Genellikle hataları/istisnaları özel olarak ele halletmelisiniz. İstisnaların global kapsamda işlenmesi yalnızca genel bir geri bildirim mekanizması olarak kullanılmalıdır, çünkü hatanın/istisnanın özel olarak halledilmesi sorunun çok daha spesifik olarak ele alınmasına imkan verir.


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!