Oluşturduğumuz yazılımlarda en önemli nokta, yazılımın kusursuz olarak çalışmasıdır. Diğer bir deyişle hatalardan arındırılmış olarak çalışmasıdır. Tanımladığınız bir değişkenin, üst sınırı aşması, tür uyuşmazlığı vb. işlemler hiç hoş olmayan hata mesajları verecektir. Bu amaçla oluşabilecek hatalara karşı yazılımımızı güvenli hale getirmek gerekmektedir. Bunu sağlayabilmek için de C# içerisinde tanımlı hata kontrol blokları ve sınıfları yer almaktadır.

Örneğin textBox’lara yazdığımız 2 tam sayıyı toplayıp sonucu görmek istiyoruz. Kodumuz aşağıdaki gibi olacaktır:

int sayi1 = Convert.ToInt32(textBox1.Text);
int sayi2 = Convert.ToInt32(textBox2.Text);
int sonuc = sayi1 / sayi2;
textBox3.Text = sonuc.ToString();

Eğer textBox1 ve textBox2’ye tamsayı değerleri yazarsak sonucu elde edebiliyoruz. Fakat yanlışlıkla(!) tamsayı dışında bir değer yazdığımızla hatayla karşılaşıyoruz:

csharp-ile-hata-yakalama-exception-handling-1

csharp-ile-hata-yakalama-exception-handling-1

 

csharp-ile-hata-yakalama-exception-handling-2

csharp-ile-hata-yakalama-exception-handling-2

kodumuzun 2. satırı bizden textBox2’ye tamsayı değeri yazmamızı beklerken yanlışlıkla(!) harf yazdık ve “Girilen string doğru formatta değil” hatasını verdi. Diğer deyişle, kod bizden tam sayı isterken onun dışında birşeylerle karşılaştı, istediğine ulaşamadığı için hata verdi.

Peki bu hatayı nasıl önleyeceğiz?

try

{
int sayi1 = Convert.ToInt32(textBox1.Text);
int sayi2 = Convert.ToInt32(textBox2.Text);
int sonuc = sayi1 / sayi2;
textBox3.Text = sonuc.ToString();
}
catch { MessageBox.Show(“Lütfen alanlara sadece sayı yazınız”); }

Kodda da görüldüğü gibi, çalışmasını istediğimiz kodları try bloğunun içine yerleştiriyoruz. Herhangi bir hata ile karşılaştığımız taktirde yapmasını istediklerimizi de catch bloğu içerisine yerleştiriyoruz.

csharp-ile-hata-yakalama-exception-handling-3

csharp-ile-hata-yakalama-exception-handling-3

Bu yöntem kesin çözüm müdür?

Hayır. Bu cevabı şu örnekle inceleyelim:

csharp-ile-hata-yakalama-exception-handling-4

csharp-ile-hata-yakalama-exception-handling-4

İstediğimiz, textBox’lara tam sayı dışında birşey yazıldığında “Lütfen alanlara sadece sayı yazınız” uyarısını gösterebilmekti. Fakat burada iki textBox’a da tamsayı yazmama rağmen aynı uyarıyla karşılaşıyoruz.

Sebebi: son yazdığımız kodda hata kontrolünü yaptık fakat hangi hatayı kontrol etmesi gerektiğini söylemedik. Herhangi bir hatayla karşılaşınca catch bloğundaki kodlar çalışacaktır.

Peki hata türüne göre işlem yapabilir miyiz?

Evet. try-catch bloğunun en güzel özelliği de budur. catch bloğunun sayısını artırarak bu işlemi gerçekleştirebiliriz.

Öncelikle bu örnekte hangi hatalarla karşılaştığımızı belirleyelim:

1. Format Hatası : FormatException
2. Sıfıra Bölme Hatası : DivideByZeroException

Şimdi bu hataların önlemlerini alalım:

 

try
{
        int sayi1 = Convert.ToInt32(textBox1.Text);
        int sayi2 = Convert.ToInt32(textBox2.Text);
        int sonuc = sayi1 / sayi2;
        textBox3.Text = sonuc.ToString();
}
catch (FormatException)
{
        MessageBox.Show(“Lütfen alanlara sadece sayı yazınız”);
}
catch (DivideByZeroException)
{
        MessageBox.Show(“Lütfen sıfıra bölme işlemi yapmayınız”);
}

İlk catch bloğunda format hatasını, ikinci catch bloğunda ise sıfıra bölme hatasını yakalıyoruz.

 

Eğer try içine yazdığımız kodda format hatası varsa FormatException’ın olduğu catch bloğunu, sıfıra bölme hatası varsa, DivideByZeroException’ın olduğu catch bloğunu çalıştırır. Hata yoksa try içerisindeki kodlar çalışır, catch bloklarına karışmadan işlemlere devam eder.