Try-Catch-Finally ve Hata Yakalama Nedir?

Try-Catch; yazmış olduğumuz kod bloklarında hataların önüne geçen bir yapıdır. Aslında hataların tam olarak önüne geçmekten kasıt hatanın önlenmesi değil, ilgili programın son kullanıcıya hata vererek sonlanmasının önüne geçmeyi sağlayan bir yapıdır.

Şöyle örnekleyelim. Diyelim ki sizin iki tane textboxınız var. İki sayının çarpımını yapan bir kod bloğunuz var. Kullanıcıdan sayı girmesini istiyorsunuz, gelen sayıyı uygun şekilde convert ediyorsunuz. İşlemi yapıyorsunuz. Olayınız bu diyelim.

Peki kullanıcı herhangi bir harf, bir karakter, bir kelime girerse ne olacak? Veya boş geçerse? Kod bloğu tabiri caizse patlayacak 😊

İşte bu noktada programın hata verip, patlamasından ziyade geriye bir bilgi mesajı verme işlemini yapan, veya nasıl sonlanmasını istiyorsanız ona göre işlem yapan yapıdır try-catch. Bir de buna finally gelecek, ama sonra değineceğim 😊

Örnekleyelim hemen, windows formuma iki adet textbox ve bir adet buton ekledim. Butona bastığımda iki sayının çarpma işlemini yapan kod bloğunu yazdım.

Try-Catch-Finally ve Hata Yakalama Nedir?
private void btnCarp_Click(object sender, EventArgs e)
        {
            int sayi1, sayi2, carpim;

            sayi1 = Convert.ToInt32(txtSayi1.Text);
            sayi2 = Convert.ToInt32(txtSayi2.Text);

            carpim = sayi1 * sayi2;

            MessageBox.Show("Sonuç: " + carpim.ToString());
        }

Normalde bu kodlarda bi hata yok. Ama kullanıcı bu ya, sayı girmezse, karakter girerse, kelime girerse vs, o zaman butona basınca program patlar. İşte bunun olmaması için, bu mantıksal hataları engellemek için try-catch yapısını kullanabilirim. Yani hatanın olma olasılığını önceden düşünerekten, önleyici işlem olarak ben herhangi bir hata olması durumunda kullanıcıya mesaj verebilirim. Dolayısı ile try catch ile kodlarımı düzenlerim.

Try-Catch yapısında, try bölümünde kodlarım yer alır. Catch bölümünde ise hata olduğunda kullanıcıya vereceğim mesaj yer alır. Hadi görelim;

private void btnCarp_Click(object sender, EventArgs e)
        {
            try
            {

                int sayi1, sayi2, carpim;

                sayi1 = Convert.ToInt32(txtSayi1.Text);
                sayi2 = Convert.ToInt32(txtSayi2.Text);
                carpim = sayi1 * sayi2;
                MessageBox.Show("Sonuç: " + carpim.ToString());
            }

            catch
            {
                MessageBox.Show("Lütfen sayısal değerler giriniz, değerlerinizi kontrol ediniz","Uyarı", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            
        }

Peki diyelim ki, kullanıcıya hatanın ne olduğunu göstermek istiyorum. O zaman ne yaparım, yine yukarıdaki örneği düşünün, bu sefer catch kısmında hata mesajını yakalayacağım. Ve bu mesajı kullanıcıya göstereceğim. Kodlarım şöyle olur;

private void btnCarp_Click(object sender, EventArgs e)
        {
            try
            {

                int sayi1, sayi2, carpim;

                sayi1 = Convert.ToInt32(txtSayi1.Text);
                sayi2 = Convert.ToInt32(txtSayi2.Text);
                carpim = sayi1 * sayi2;
                MessageBox.Show("Sonuç: " + carpim.ToString());
            }

            catch (Exception hata)
            {
                MessageBox.Show(hata.ToString());
            }

            
        }

Sonra diyelim ki, ilk sayım 3 ikincisi null, sonuç aşağıdkai gibi olur. Yani hatanın ne olduğu kullanıcıya verilebilir. Burada Exception kısmı ile hatayı yakalamış oluruz.

Try-Catch-Finally ve Hata Yakalama Nedir?
Finally Bloğu:

Gelelim Finally kısmına. Bu bloklarda Finally eklenmesi durumunda her ne olursa olsun, her durumda ve her koşulda Finally bloğu içindeki işlemlerin yapılması beklenir. Yani hata olmadı diyelim; try içindekiler ve finally içindekiler, hata oldu diyelim; catch içindekiler ve finally içindeki kodlar çalışır. Gelelim bunu örneklemeye yine yukarıdaki örnekten gidiyorum, Finally bloğunda bir mesaj verdirelim.

private void btnCarp_Click(object sender, EventArgs e)
        {
            try
            {

                int sayi1, sayi2, carpim;

                sayi1 = Convert.ToInt32(txtSayi1.Text);
                sayi2 = Convert.ToInt32(txtSayi2.Text);
                carpim = sayi1 * sayi2;
                MessageBox.Show("Sonuç: " + carpim.ToString());
            }

            catch (Exception hata)
            {
                MessageBox.Show(hata.ToString());
            }

            finally
            {
                MessageBox.Show("Ne yaparsan yap, bu mesajdan kaçış yok:)");
            }
        }


Hata alsakta, almasakta ne yaparsak yapalım, finally içindeki koddan kaçamayacağız 😊

Şimdilik bu kadar..

Bir cevap yazın

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