23 Ocak 2018 Salı

Niçin Try Catch Kullanma(ma)lıyız ?

       S.a. Arkadaşlar,
       Bugünkü konumuz try carch ile ilgili, fakat nasıl kullanılacağı ile ilgili değil. Eğer nasıl kullanıldığına bakacaksınız buradaki yazımdan bakabilirsiniz. Peki biz ne ile ilgileneceğiz. Biz hangi durumlarda try catch kullanmalıyız, hangi durumlarda kullanmaktan kaçınmalıyız sorusunun cevabını arayacağız.

     Bu soru nereden aklıma geldi diye sorarsınız, yazdığımız kodlarda try catch kullanmamızla ilgili bir şeyler konuşuyorduk, fakat bu kullanılan try catch'lerin hatayı beklediği için her yerde kullanılması performansı düşürebileceğini söyledi bir arkadaşımız. Ben de bu konuyu detaylıca araştırmaya karar verdim. Bunla ilgili  Türkçe bir kaynağa rastlayamadım. Bu yüzden ben de bu konuda Türkçe bir kaynak olması düşüncesiyle bir şeyler karalamak istedim. Ayrıntılı bilgi için yararlandığım siteleri vereceğim. İsteyen oralardan da bakabilir.

    Try catch'in farklı kullanımları var. Bunlardan biri tüm kodu try catch içine alıp genel bir hata fırlatmaktır. Şöyle ki ;
try
{
   //tüm kod
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

   Burada yapılan kolaya kaçmaktır. Çünkü burada yapılan aman kod patlamasın da nolursa olsun mantığında yazılan bir koddur. Bu bile hiç try catch kullanılmamasından iyidir. Bunun daha kötüsü ise hatayı yutmaktır. Şöyle ki catch'in içi boş bırakılır, kullanıcı bir şeyi fark etmez. Sanki hiç bir hata olmamış gibi davranır program ama bu farklı sebeplerle sizin başınızı daha fazla belaya sokabilir.

    Başka bir kullanım tarzına gelince;
int x=1;
int y=0;
try
{
    Console.WriteLine("x/y={0}",x/y);
}
catch
{
    Console.WriteLine("tanımsız");
}
 
    Burada basit bir kullanım var ve biz bu problemi if ile de çözebiliyorken neden try catch kullanalım. Bunu böyle de çözebiliriz.
int x=1;
int y=0;
if(y==0)
    Console.WriteLine("tanımsız");
else
    Console.WriteLine("x/y={0}",x/y);

    Aslına bakılırsa böyle basit veya gözden kaçırmayacağınıza inandığınız bir kodu bu şekilde kontrol edebilirsiniz. Hatta şahsi fikrimi sorarsanız böyle kontrol etmelisiniz. Çünkü try catch'in hatayı fırlatma amacıyla tüm kodun derlenmesini beklemesi ve ona göre hata fırlatıp fırlatmayacağına karar vermesi zaman kaybıdır. Bununla ilgili bu linkteki Richmond'un cevabını inceleyebilirsiniz. Burada dikkat edilmesi gereken şey ise şudur: Bu gibi kolay, gözden kaçmayacak problemler olmuyor her zaman bildiğiniz gibi. Mesela veri tabanına bağlanma ile ilgili bir kontrol yapıyorsanız try catch kullanmanızda fayda var. Aynı şekilde dosyadan okuma yapıyorsanız veya birden çok koşulun olabileceği durumlar olabilir. Oralarda da try catch ile bunu kontrol etmek çok daha kolay olabilir. Her şeyin avantaj ve dezavantajları olduğu gibi , bunun maliyetini göze almak durumundasınız.

    Try catch'in büyük faydaları tabi ki vardır. Fakat bunları azaltmak programın hızlanması açısından iyi olabilir. Bunu başarabilmenin bir yolu da hataları loglamak. Daha sonra loglar incelendiğinde en çok nerelerde hatalar dönmüş , gerçekten istisna durumlar mıdır yoksa genel yapılan hatalar mı vardır gibi soruların cevaplarını alabilirsiniz ve bu sayede kodlarınızdaki sık rastlanan hataları ayıklayabilirsiniz. Bununla ilgili yine aynı sitede Ranelli'nin söylediğine göz atabilirsiniz.

    Yukarıda da belirttiğimiz gibi , her kod bu kadar basit olmayabilir. Bir kod bloğunda birden fazla kontrol yapmanız gerekebilir. Bunun için de if else yapısıyla tüm hepsini kontrol etmek hem zor olabilir hem kodunuzun okunurluğunu azaltabilir. Şöyle ki [1]:
     try{
         int a[]=new int[7];
         a[4]=30/0;
     }
     catch(ArithmeticException e){
        Console.WriteLine("ArithmeticException Hatası");
     }
     catch(ArrayIndexOutOfBoundsException e){
        Console.WriteLine("ArrayIndexOutOfBoundsException Hatası");
     }
     catch(Exception e){
        Console.WriteLine("Diğer Olası Hatalar");
     }

    Bu kodu dediğimiz gibi if ile kontrol etmek yine mümkün ama git gide bunu kontrol etmek zorlaşacaktır. Ayrıca kodunuzda içe doğru dallanmalar başlayacak ve bu da kodunuzun okunmasını zorlaştırmakla birlikte, debug sürenizi artırabilir. Burada ayrıca söylemek istediğim bir şey de catch'lerin özelden genele doğru gitmesidir. En son bizim kontrol ettiğimiz veya gözden kaçırdığımız bir durum olursa genel exception'a düşer.

     Sonuç olarak : Hataların ne kadarını kontrol ederseniz o kadar iyi, fakat bununla başa çıkamadığınız yerlerde try catch kullanmanız programın kırılmaması açısından iyi bir çözümdür.

    Yanlış olduğunu düşündüğünüz veya eklemek istediğiniz bir yer olursa düşüncelerinizi paylaşmanızı rica ederim. Benim amacım öğrendiklerimi yazmaktı. Hem belki bu konuda Türkçe küçük bir kaynak da olur. Hoşça kalın.

     Düzenleme : Daha sonradan gördüğüm 2 linki daha paylaşmak istiyorum. Yıllar önce yazılmış olsa da güncelliğini koruyan 2 Türkçe try catch yazısı. Okumanızı öneririm.
   http://univera-ng.blogspot.com.tr/2011/01/vbnet-try-catch-blogunda-degisken.html
   http://univera-ng.blogspot.com.tr/2011/01/vbnet-gereksiz-try-catch-bloklar.html

Kaynaklar:
[1]https://beginnersbook.com/2013/04/try-catch-in-java/
https://stackoverflow.com/questions/18908773/if-try-catch-can-be-replaced-by-if-then-else-which-one-is-recommended


2 yorum: