WPF - Özel Durum İşleme
Bir istisna, bir programın yürütülmesi sırasında karşılaşılan herhangi bir hata durumu veya beklenmeyen bir davranıştır. Birçok nedenden dolayı istisnalar gündeme gelebilir, bunlardan bazıları aşağıdaki gibidir -
Kodunuzda veya aradığınız kodda hata (paylaşılan kitaplık gibi),
Kullanılamayan işletim sistemi kaynakları,
Ortak bir dil çalışma zamanının karşılaştığı beklenmedik koşullar (doğrulanamayan kod gibi)
Sözdizimi
İstisnalar, bir programın akışını bir bölümden diğerine aktarma yeteneğine sahiptir. .NET çerçevesinde, istisna işleme şu dört anahtar kelimeye sahiptir:
try - Bu blokta, program, bazı istisnaları ortaya çıkaran belirli bir koşulu tanımlar.
catch- catch anahtar sözcüğü, bir istisnanın yakalandığını gösterir. Birtry bloğun ardından bir veya daha fazla catch bir programda sorunu çözmek istediğiniz yerde bir istisna işleyicisi ile bir istisnayı yakalamak için bloklar.
finally- Nihayet bloğu, bir istisna atılsa da atılmasa da, belirli bir ifade kümesini yürütmek için kullanılır. Örneğin, bir dosyayı açarsanız, bir istisna ortaya çıksa da çıkmasa da kapatılmalıdır.
throw- Bir program, bir sorun ortaya çıktığında bir istisna atar. Bu, bir throw anahtar sözcüğü kullanılarak yapılır.
Bu dört anahtar kelimeyi kullanmak için sözdizimi aşağıdaki gibidir -
try {
///This will still trigger the exception
}
catch (ExceptionClassName e) {
// error handling code
}
catch (ExceptionClassName e) {
// error handling code
}
catch (ExceptionClassName e) {
// error handling code
}
finally {
// statements to be executed
}
Bir try bloğunun bir program akışının durumuna bağlı olarak birden fazla istisna oluşturabildiği durumlarda çoklu catch deyimleri kullanılır.
Hiyerarşi
.NET çerçevesindeki neredeyse tüm istisna sınıfları doğrudan veya dolaylı olarak Exception sınıfından türetilir. Exception sınıfından türetilen en önemli istisna sınıfları şunlardır:
ApplicationException class- Programlar tarafından oluşturulan istisnaları destekler. Geliştirici istisna tanımlamak istediğinde, sınıf bu sınıftan türetilmelidir.
SystemException class- Önceden tanımlanmış tüm çalışma zamanı sistemi istisnaları için temel sınıftır. Aşağıdaki hiyerarşi, çalışma zamanı tarafından sağlanan standart istisnaları gösterir.
Aşağıdaki tablo, çalışma zamanı tarafından sağlanan standart istisnaları ve türetilmiş bir sınıf oluşturmanız gereken koşulları listeler.
İstisna türü | Baz türü | Açıklama |
---|---|---|
Exception | Nesne | Tüm istisnalar için temel sınıf. |
SystemException | İstisna | Çalışma zamanında üretilen tüm hatalar için temel sınıf. |
IndexOutOfRangeException | SystemException | Çalışma zamanı tarafından yalnızca bir dizi hatalı bir şekilde dizine eklendiğinde atılır. |
NullReferenceException | SystemException | Yalnızca boş bir nesneye başvurulduğunda çalışma zamanı tarafından atılır. |
AccessViolationException | SystemException | Çalışma zamanı tarafından yalnızca geçersiz belleğe erişildiğinde atılır. |
InvalidOperationException | SystemException | Geçersiz bir durumda olduğunda yöntemler tarafından atılır. |
ArgumentException | SystemException | Tüm bağımsız değişken istisnaları için temel sınıf. |
ArgumentNullException | ArgumentException | Bir bağımsız değişkenin boş olmasına izin vermeyen yöntemler tarafından atılır. |
ArgumentOutOfRangeException | ArgumentException | Bağımsız değişkenlerin belirli bir aralıkta olduğunu doğrulayan yöntemler tarafından atılır. |
ExternalException | SystemException | Çalışma zamanı dışındaki ortamlarda oluşan veya hedeflenen istisnalar için temel sınıf. |
SEHException | ExternalException | Win32 yapılandırılmış özel durum işleme bilgilerini kapsayan özel durum. |
Misal
Konsepti daha iyi anlamak için basit bir örnek verelim. Adıyla yeni bir WPF projesi oluşturarak başlayınWPFExceptionHandling.
Araç kutusundan bir metin kutusunu tasarım penceresine sürükleyin. Aşağıdaki XAML kodu bir metin kutusu oluşturur ve bazı özelliklerle onu başlatır.
<Window x:Class = "WPFExceptionHandling.MainWindow"
xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x = "http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d = "http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc = "http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local = "clr-namespace:WPFExceptionHandling"
mc:Ignorable = "d"
Title = "MainWindow" Height = "350" Width = "604">
<Grid>
<TextBox x:Name = "textBox" HorizontalAlignment = "Left"
Height = "241" Margin = "70,39,0,0" TextWrapping = "Wrap"
VerticalAlignment = "Top" Width = "453"/>
</Grid>
</Window>
Burada, C # 'da istisna işleme ile okunan dosya.
using System;
using System.IO;
using System.Windows;
namespace WPFExceptionHandling {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
ReadFile(0);
}
void ReadFile(int index) {
string path = @"D:\Test.txt";
StreamReader file = new StreamReader(path);
char[] buffer = new char[80];
try {
file.ReadBlock(buffer, index, buffer.Length);
string str = new string(buffer);
str.Trim();
textBox.Text = str;
}
catch (Exception e) {
MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
}
finally {
if (file != null) {
file.Close();
}
}
}
}
}
Yukarıdaki kodu derleyip çalıştırdığınızda, metin kutusu içinde bir metnin görüntülendiği aşağıdaki pencereyi üretecektir.
Bir istisna ortaya çıktığında veya bunu manuel olarak attığınızda (aşağıdaki kodda olduğu gibi), hata içeren bir mesaj kutusu gösterecektir.
using System;
using System.IO;
using System.Windows;
namespace WPFExceptionHandling {
public partial class MainWindow : Window {
public MainWindow() {
InitializeComponent();
ReadFile(0);
}
void ReadFile(int index) {
string path = @"D:\Test.txt";
StreamReader file = new StreamReader(path);
char[] buffer = new char[80];
try {
file.ReadBlock(buffer, index, buffer.Length);
string str = new string(buffer);
throw new Exception();
str.Trim();
textBox.Text = str;
}
catch (Exception e) {
MessageBox.Show("Error reading from "+ path + "\nMessage = "+ e.Message);
}
finally {
if (file != null) {
file.Close();
}
}
}
}
}
Yukarıdaki kod yürütülürken bir istisna ortaya çıktığında, aşağıdaki mesajı gösterecektir.
Yukarıdaki kodu çalıştırmanızı ve özelliklerini denemenizi öneririz.