Exception Handling – İstisnai Durum Yönetimi

Programlama diline ne kadar hakim olunursa olunsun program çalışırken oluşan ve programın çalışmasını etkileyen hatalar her zaman ortaya çıkabilir. Bu hatalar kullanıcı kaynaklı, mantıksal veya sistemsel hatalar olabilir. C#?ta çalışma zamanında ortaya çıkabilecek bu hataları önceden sezip bunlar için ne gibi bir işlem yapılacağını, programın bu hatalara nasıl cevap verebileceğini belirleyebiliyoruz. .NET?te beklenmedik bir hata oluşumunda bu hatalar genel olarak System.Exception sınıfı tarafından yönetilir. Buna göre bu sınıf kullanılarak kendimize ait hata yönetimleri yazabiliriz. Buna ek olarak bazı standart hatalara karşı .NET ortamında sınıflar oluşturulmuştur tabi bunların sayısı oldukça fazladır. En genel olanlara değinirsek, Arithmetic.Exception sınıfından türemiş olan DivideByZeroException, OverflowException, yanlış tür dönüşümlerinde InvalidCastException, bellek hataları için OutOfMemoryException gibi bir çok sınıf bulunur.

.NET ortamında bu istisnai durumları yakalamak için 4 anahtar sözcük vardır bunlar try,catch, finally ve throw?dur. Bunlardan try-catch-finally bir blok yapısıdır. throw ise bir hatanın geri fırlatılmasını sağlamaktadır.

try sözcüğü, kaynak kodların yer aldığı programımızın normal işleminin bulunduğu yapıda kullanılır, buraya özel bir kod yazılmaz. İstisnai bir durum olursa, buradan cacth bloğuna yönlenilir.

catch sözcüğü, istisnai durumun yakalandığı ve bunun sonucunda ne yapılacağını belirttiğimiz kısımdır.

finally sözcüğü, try ve catch blokları çalıştıktan sonra her şekilde ne olursa olsun çalışacak kodlarımız buraya yazılır. Kullanılması isteğe bağlı bir durumdur, çünkü try bloğundan sonra hata yakalanmaz ise zaten programım catch bloğundan sonra işlemine devam edecektir. Finally olmasa da olur ama try ve catch blokları mutlaka olmalıdır. Burada şu noktaya da değinmek istiyorum try ve finally de olabilir sadece ama bu sefer istisnai durum yakalama işleminin pek bir anlamı kalmaz.

throw sözcüğü, try bloğu içinde bir hata oluştuğunda ilgili hata nesnesi sınıfını fırlatmak için kullanılır.

Peki bu blok yapısı nasıl bir bakalım :
try
{
//Kodlar, hatayı bulduğumuz kısım
}
catch (HataSınıfıAdı x)
{
//hata durumunda işlenecek kodlar
}
Finally
{
//ne olursa olsun yapılacak işlemler.. İsteğe bağlı olup, olmaması..
}

Bu yapıya göre try kısmında programımın kodları bulunur, yani normal işleyişi devam eder, herhangi bir hata meydana gelmez ise çalışmaya devam eder, eğer hata oluşursa catch bloğuna dallanır olmaz ise var ise finally yok ise normal akışına devam eder. Catch bloğuna gelirse buradaki işlemler yapılır, birden fazla catch bloğu bulunabilir. Finally bloğu varsa her ne olursa olsun çalışacak kısımdır.

Şimdi kullanımı örnekleyelim :

Örneğin program çalışma esnasında kullanıcı textbox’a string bir değer girdiğinde program hata verecektir ve duracaktır, işte bu durumu önceden sezme ihtimalini dikkate alarak şimdi try-catch yapısı kullanıyorum.

catch blokları birden fazla da olabilir. Yani hatanın ne olduğuna göre programın ne yapmasını gerektiğini de bu şekilde belirleyebiliriz. Buna bir örnek yapalım örneğin aşağıdaki kod parçacığında 3 elemanlı bir dizi tanımlanmış fakat 5. elemana değer atama işi yapıyoruz. Burada girilen değer int’e convert edilemiyorsa yani değer string ise formatexception sınıfı çalışacak ve ekrana sayısal değer giriniz denilecek, eğer değer int türüne çevriliyor ise bu seferde dizi aşımı hatası verecek çünkü dizimiz 3 elemanlı biz 5. elemana değer atamaya çalışıyoruz, bunu da IndexOutOfRangeException sınıfı ile buluyoruz.

Birden fazla catch bloğu kullanıldığında bazı dikkat edilecek durumlar vardır. Eğer try türünden fırlatılan bir hata catch bloğunda tanımlanan hata sınıflarında uyumlu değilse program hata verir, çalışması sonlanır. Dolayısı ile ya tanımlanmalıdırlar ya da genel olarak Exception sınıfından hata türediğini belirten catch bloğu da tanımlanmalıdır, ilk örneğimizde olduğu gibi. Örneğin ikinci örneğimizde int türüne dönüştürmeyi kontrol ettik diyelim, ama dizi aşımını exception ile kontrol ettik, bu durumda çevrim yapılamaz ise ilk catch bloğu çalışır, diğer durumlarda exception sınıfına ait olan catch bloğu çalışacaktır. Burada sıralamaya dikkat edilmeli ayrıca sıralama özelden genele doğru olmalıdır, yani önce özel belirtilen exception sınıfları sonra en geneli kullanılacak ise en sonda olmalıdır. Çünkü ilk catch bloğunda genel exception sınıfı kullanılırsa alttaki exception sınıflarını da kapsadığı için hata olacaktır. Catch blokları herhangi bir tür belirlenmeden de tanımlanabilir. Ayrıca catch blokları arasında ayrıca bir kod bulunmamalıdır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir