5 Nisan 2012 Perşembe

C# 'da Hata Yakalama - TRY CATCH FINALLY

Neden program hata verir?
        Hatalar, program ile kullanıcı arasındaki bir haberleşme şeklidir. Hata türüne göre kullanıcının davranışı değişir. Örneğin TC kimlik numarası istenilen bir yere kullanıcı adını girmeye çalışıyorsa, burada yazılımcı olarak kullanıcıyı yönlendirmemiz gerekir.
        .NET Framework 'ü yazanlar, hataların kontrolünü yani sorumluluğunu programcıya bırakmışlardır. Programın akışı esnasında çalışmasında hata alma riski gördüğümüz bazı kodlar vardır. İşte bu hataları programcı olarak kontrol altına almalıyız. Çünkü kontrol altına almaz isek program çalışırken hata ile karşılaşırsa fail olur, çalışmasını durdurur. Bu durum, hem kullanıcı için hem de programcı için istenmeyen bir durumdur. Bu noktada programcının kullancıyı hatanın nedenine göre uyarması ve yönlendirmesi gerekir. 
        Hatalar yumruk gibidir; öngörülemezse kafaya yenir, can yakar. Öngürülürse yakalanır ve kontrol altına alınır. 
        Hata almak ayıp değildir, programcı olarak hatayı öngörüp, yönetmemiz gerekir.
TRY-CATCH
         Özellikle kullanıcıdan veri girişi yapmasını istediğimiz zaman TRY-CATCH kullanmak tavsşyemdir.
         Konumuz try- catch kod bloklarıdır. Try kelime anlamı olarak çalış yada dene anlamındadır. Catch ise yakala anlamındadır. İki blok beraber kullanılırlar.
            
            try
            {
                // hata verebilme risk olduğunu düşündüğümüz kod bloğu
                // arkasından çalışmasını istediğimiz, riskli kod ile bağlantılı olan kodlar
            }
            catch 
            {
                // Burada kulanıcıya hatanın sebebini ve ne yapması gerektiğini söyleyebiliriz. Yada programın akışını değiştirebiliriz.
            }

          Hata verme riski olduğunu düşündüğümüz kod satırını yada kod satırlarını TRY bloğu içerisinde yazarız. Riskli kod hata verirse, altındaki kodlar çalışmayacak ve program akışı CATCH bloğundan devam edecektir. 
            
            try
            {
                // hata verebilme risk olduğunu düşündüğümüz kod bloğu
                // arkasından çalışmasını istediğimiz, riskli kod ile bağlantılı olan kodlar
            }
            catch(Exception ex)
            {
                MessageBox.Show("Hata mesajı : " + ex.Message);
            }

        Yukarıdaki kullanımda ise kullanıya hata mesajının orjinal halini de MessageBox olarak verebiliriz. Hatanın nedenini haber vermek istiyorsak, yada ayrı ayrı hatanın nedenine göre programı şekillendirmek istiyorsak, en genel hata sınıfı olana Exception sınıfından türüyen hata sınıflarını kullanabiliriz.
        Aşağıdaki örnekte kullanıcı sayı girişi yaparsa FormatException verecektir. Format denilince veri tipinin dönüştürülemediğini anlıyoruz.
            try
            {
                int sayi = Convert.ToInt32(txtSayi1.Text);
                // sayi = sayi / Convert.ToInt32("0");
                MessageBox.Show("Test");
            }
            catch (FormatException)
            {
                MessageBox.Show("Girdiğiniz veri sayıya dönüştürülemedi");
            }
            catch (OverflowException)
            {
                MessageBox.Show("girdiğiniz değer çok küçük ya da çok büyük");
            }
            catch (Exception)
            {
                MessageBox.Show("Bilinmeyen bir hata oluştu");
            }
            finally
            {
                MessageBox.Show("İşlem tamamlandı");
            }

         CATCH bloğu görüldüğü üzere, farklı hata türleri için birden fazla kullanılabilir. Tek de kullanılabilir. Fakat TRY bloğu tek başına kullanılmaz, ya en az bir tane CATCH bloğu yada bir adet FINALLY bloğuyla kullanılır.
         Yukarıdaki örnekte yorum satırını etkinleştirirsem, programın akışı  3. Catch bloğundan devam edecektir. Sıfıra bölünme hatası vereceğinden dolayı ve o hatayı tanımlamadığımdan dolayı, en genel hata sınıfı olan Exception sınıfının Catch bloğuna girecektir. Orjinal mesajlarını da yazdırabiliriz.
                     try
            {
                int sayi = Convert.ToInt32(txtSayi1.Text);
                // sayi = sayi / Convert.ToInt32("0");
                MessageBox.Show("Test");
            }
            catch (FormatException fex)
            {
                MessageBox.Show(fex.Message);
            }
            catch (OverflowException oex)
            {
                MessageBox.Show(oex.Message);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                MessageBox.Show("İşlem tamamlandı");
            }
FINALLY
Kullanmak şart değildir. Program akışı esnasında, TRY bloğunda hata ile karşılaşılsın yada karşılaşılmasın yani CATCH bloğu çalışsın çalışmasın, FINALLY bloğundaki kodlar mutlaka bir kere çalışırlar. 
            try
            {
                // hata verebilme risk olduğunu düşündüğümüz kod bloğu
                // arkasından çalışmasını istediğimiz, riskli kod ile bağlantılı olan kodlar
            }
            finally
            {
                // TRY bloğunda riskli kod ile ilgisiz olan ve ne olursa olsun bir kere çalışması istenen kodlar.
            }
yada ;
            try
            {
                // hata verebilme risk olduğunu düşündüğümüz kod bloğu
                // arkasından çalışmasını istediğimiz, riskli kod ile bağlantılı olan kodlar
            }
            catch
            {
                // TRY bloğunda hata olursa çalışır. 
            }
            finally
            {
                // TRY bloğunda riskli kod ile ilgisiz olan ve ne olursa olsun bir kere çalışması istenen kodlar.
            }

örnek :
        //Metod, finally bloğuna uğrar ve 0 döner
        public static int Test()
        {
            try
            {
                return 0;
                //try a giren her kod finally uğrar
            }
            catch
            {

            }
            finally
            {
                Console.WriteLine("finally");
                //Burası her halükarda çalışır.
            }
            return -1;
        }

Riskli Kodu Nasıl Anlarım?
Arkadaşlar, ToInt32 metodumun üzerine mouse 'umun kursör 'ünü getirdiğimde çıkan penceredeki Exception başlığına dikkatinizi çekmek istiyorum. Burada görüldüğü üzere bu metod bize kullanımına göre, FormatException ve OverflowException olmak üzere iki tip hata fırlatabileceğini anlatıyor. Evet arkaadaşlar sizin de ToInt32 metodu gibi hata verebileceğini düşündüğümüz metodlar varsa o metodların üzerine kursörünüz ile gelerek, verebileceği hataları görebilir, bu hatalara karşı önleminizi alabilirsiniz.  .

Hiç yorum yok:

Yorum Gönder