Merhaba arkadaşlar , bu yazımızda programlama esnasında oluşmayan kullanıcı kaynaklı yani çalışma zamanında oluşan hataları kontrol etmeye bakacağız.Bu hataları yakalama işlemine İstinai Durum Yönetimi ( Exception Handling ) denilmektedir.Çalışma zamanında oluşan bütün istisnai durumlar birer sınıftır.Bu sınıftlar oluşan hatanın türüne göre tepkiler göstermektedir..NET mimarisi çok sık oluşan hatalar ile ilgili bizim kullanmamızı sağlayan sınıfları bulunmaktadır.Tabi ki büyük uygulamalarda bu hazır sınıfları kullanmayıp uygulama mantığımıza göre kendi istisnai class'larımızı yazarak hataları yakalayabiliriz. .NET mimarisinde herşey sınıflardan oluştuğu için .NET'in bize sağladığı hazır exception class'larıda bir yerden türemesi lazımdır.Bu türetilen System.Exception nesnesidir.
Programlama tarafında bu hataları göz önüne alarak yakalayabilmemiz için bazı işlemler yapmalıyız. Bu işlemleri yapmamızda kullanacağımız kodlar ; try, catch,finally ve throw dur.
Try bloğunda bizim gerçekten yapmamız gereken işlemler bulunur.Şöyle düşünürsek bizim temel işlemimiz burada olacağından bir hata oluştuğunda otomatikman oluşan hataya ait bir exception class'ı fırlatılır.
catch, blogu bir üstünde bulunan try blogundaki kodlar sonucu oluşan hatayı yakalamaya yarar.Ve bu yakaladığı hataya göre işlemler yapar.
finally , blogu kullanılması zorunlu değildir.Ama kullanıldığı takdirde üst tarafta bulunan iki blokta açılan bağlantıları kapatılır.Örnek bir database'in bağlantısını verebiliriz.Bu blokta bulunan kodlar üst taraftaki bloklarda ne olursa olsun yani hata oluşsun veya oluşmasın çalışacaktır.
Bir örnek üzerinden devam etmek gerekirse bir dizi tanımlayalım 15 elemanlı ve try blogu içerisinde dizinin 20 elemanına değer atamaya çalışalım.Bakalım tepki ne olacak.
int[] dizi = new int[15];
try
{
dizi[20] = 152;
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
Bu programı çalıştırdığımızda aşağıdaki hata mesajını alırız.
Tanımlamış olduğumuz dizi 15 elemanlı olduğundan ve biz de try blogunda olmayan 20'ci elemana değer atadığımızdan IndexOutOfRangeException isimli .NET mimarisinde hazır bulunan nesne fırlatılır. catch blogunda belirttiğimiz Exception temelde olduğundan standart hatalar fırlatılmaktadır.Yukarıdaki örnek üzerinden devam edersek aynı hata oluştuğunda bu standart hatayı değilde bizim kendi belirlediğimiz bir hatayı fırlatmak isteseydik catch blogunu aşağıdaki şekilde tanımladığımızda oluşan hatada bizim belirttiğimiz mesaj gösterilir.
catch
{
Console.WriteLine("Dizinin boyutu aşıldı");
}
Try blogunda hata oluştuğunda hataya ait bir exception nesnesi bulamadığından bizim belirtiğimiz catch blogunu çalıştırıp kullanıcıya istediğimiz hata mesajını yazdırdığımız gibi burada birçok işlemi yine yapabiliriz.
Bizim uygulamalarımızda yukarıdaki tek türden hata alamayabiliriz.Bütün istisnai nesneler Exception class'ından türediği için farklı exception nesnelerini kullanıp yukarıdaki Message özelliğiyle oluşan hata türüne ait mesajları alabiliriz.int değer bekleyen değişkene string bir değer atadığımızda mesela bize aşağıdaki hata mesajı fırlatılmaktadır.
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
catch blogunu yukarıdaki şekilde tanımladığımızdan genel olarak bize Exception'un gelen uyarısı fırlatılmıştır.Ama bizim örneğimizde int beklenen yere string değer girdiğimizde aslında burada FormatException isimli istisnai durum oluşmuştur.Biz bu Format uyumsuzluğunu ve int tipinin değerinden fazla bir sayı girildiğinde oluşma olasılığı olan bu 2 istisnai durumu farklı iki catch blogunda yakalamak isteseydik aşağıdaki şekilde örneğimizi değiştirmemiz gerekecekti.Oluşacak istisnai durumlar OverflowException ve FormatException istisnai durumlarıdır.
Console.WriteLine("Sayı giriniz");
try
{
int i = int.Parse(Console.ReadLine());
}
catch (FormatException exp)
{
Console.WriteLine(exp.Message);
}
catch (OverflowException)
{
Console.WriteLine(exp.Message);
}
Kodumuzu yukarıdaki şekilde tanımladığımızda artık int tipinin değer aralığı dışında bir değer girildiğinde programımız patlamayacaktır.Çünkü oluşma olasılığını göz önünde bulundurarak böyle bir hata ile karşılaşıldığında belirtmiş olduğumuz catch blogunda uyarımızı veriyoruz. Artık program bizden sayı beklediğinde string bir değer girdiğimizde FormatException istisnai durumunun message özelliğindeki değeri ekrana yazdıracaktır.Aynı şekilde OverflowException'da davranacaktır.
Bu şekilde programımızda oluşacak hatalara göre işlemler yapabiliriz.Çok daha geniş bir konu olduğundan sadece temel özelliklerini anlatmak istedim.
İyi çalışmalar herkese :)
Serhat TAŞ