Exception Handling Nedir ve Hatalar Nasıl Yakalanır?

Bir uygulamanın çalışması sırasında istenmeyen durumlar, hatalar ortaya çıkar ve programın akışını durdurur. Bu hatalar; programı yazan kişiden programı kullanan kişiye kadar çeşitli kaynaklardan ortaya çıkabilir.

Bilinen üç çeşit hata vardır;

Compile Time Exception: Derleme zamanı hatası anlamına gelir ve programın derlenmesini engelleyen syntax hatalarıdır (noktaları virgül unutma yada yazım yanlışı vs.)

Run Time Exception: Çalışma zamanı hataları anlamına gelir ve tamamen kullanıcıdan kaynaklı hatalardan meydana gelir.Yazılımcı kullanıcının hata yapma riskini göz önünde bulundurup programın yarıda kesilmesini engelleyecek şekilde geliştirme yapmalıdır.

Logical exception: Mantık hataları da denir ve yazılımcıdan kaynaklı hatalardır. Yazılımcının uykusuz olması, gözünden kaçması gibi durumlar örnek verilebilir. Bulunması en güç hata çeşitlerinden biridir ve hatayı inceleyen kişi, yazılan tüm kodları yeniden okumak zorunda kalabilir.

Yukarıdaki kaynaklardan dolayı oluşan istenmeyen durumları kontrol etme işlemine Exception Handling - Hata Yönetimi denir. Hata Yönetimi'nde amaç programın akışının kesilmesini engellemek ya da hataların analizini yaparak kullanıcıyı bilgilendirmektir. Bu şekilde kullanıcı yanlış bir işlem yaparak hata almayacaktır.

Peki hata yönetimi nasıl yapılır? Cevap: Hataları yakalayarak

C#, Java gibi dillerde ortak olarak kullanılan try / catch / finally blokları vardır.

try : Hata alınması muhtemel kodların yazıldığı kod bloğudur. Hata ortaya çıktığında hata sınıfına ait instance yaratabiliriz.

catch: Hatanın yakalandığı alandır. Hata oluştuğunda çalışacak kodlar bu bloğa yazılır. Farklı hata tipleri için farklı catch blokları oluşturulabilir.

finally: Bu bloğa yazılan kodlar hata olsa da olmasa da çalışacaktır.

            try
            {
                //Hata alınması muhtemel kodlar buraya yazılır
            }
            catch (Exception)
            {
                throw;
                //Hatalar burada çözümlenir.
                //Hata oluştuğunda çalışacak kodlar buraya yazılır.                
            }
            finally
            {
                //Hata olsun olmasın çalışacak kodlar buraya yazılır.
            }

Bu blokların çalışma sırası

try ->catch ->finally şeklindedir ve bu sıralamada yazılması gerekmektedir.

Örneğimizde byte türünden iki sayının bölme işlemi sırasında alınacak muhtemel hataların analizi yapıldı ve try/catch blokları oluşturuldu.

            try
            {
                Console.WriteLine("Byte Türünden Bir Sayı Giriniz:");

                byte pay = Convert.ToByte(Console.ReadLine());

                Console.WriteLine("Bölüncek Sayı Giriniz:");

                byte payda = Convert.ToByte(Console.ReadLine());
                Console.WriteLine("Sonuç:" + Divide(pay , payda));
            }
            catch (FormatException e)
            {
                Console.WriteLine("GetType: " + e.GetType());
            }
            catch (OverflowException overflow)
            {
                Console.WriteLine("GetType: " + overflow.GetType());
            }
            catch
            {
                Console.WriteLine("Bilinmeyen bir hata oluştu.");
            }
            finally
            {
                Console.ReadKey();
            }
        }
        public static int Divide(byte firstNumber, byte secondNumber)
        {
            return firstNumber / secondNumber;
        }

Byte 0 ile 255 arasında değer alır bu aralıklar dışında bir değer girilirse OverflowException hatası eğer byte değeri dışında string bir değer girilirse FormatException, farklı bir hata alınırsa da üçüncü catch bloğuna düşecektir.

Dikkati çekmesi gereken bir konu catch bloğunda hata adı belirtilmemişse en son catch bloğu olarak eklenecektir.

            try
            {

            }
            catch (FormatException e)
            {
                //Hata 1
            }
            catch (OverflowException overflow)
            {
                //Hata 2
            }
            catch
            {
                //Hata adı bilinmediği için bu blok en son catch bloğudur.
            }
            finally
            {
                 
            }
        }

catch ile catch(Exception ex) aynı anda kullanılamaz. Derleme zamanı hatası(Compile time error) alırız.

Yanlış kullanım

            try
            {

            }
            catch
            {

            }
            catch (Exception)
            {
                throw;
            }

Finally bloğu yalnız bir kez kullanılabilir. Return, continue gibi anahtar kelimeler barındıramaz.

try ile finally blokları catch blokları olmadan kullanılabilir. Fakat finally bloğu yoksa try bloğu catch bloğu olmadan tek başına kullanılamaz.

Doğru Kullanımlar


            try
            {                

            } 
            finally
            {                 

            }

            try
            {
                 
            }           
            catch
            {
                 
            }

Yanlış Kullanım


            try
            {
                 
            }  

Throw

İstenilen anda veya hata ile karşılaşıldığı anda kullanılan anahtar bir kelimedir. İlgili hata sınıfından bir nesne oluşturmamızı sağlar.

Throw kullanımı - throw new Exception();

            try
            {

            }
            catch (Exception)
            {
                throw;
            }

Yorumlar