Hataları bulma, kontrol etme ve giderilmesi.

hata

Hataları bulma, kontrol etme ve giderilmesi

Merhabalar,
Herhangi bir program yazarken elbet bir takım hatalar meydana gelir, programın çalışmasına engel ve yarıda kesilmesine sebep olurlar. Bu sebeple “Hatasız kul olmaz” sözünü aynı şekilde “Hatasız program olmaz” şeklinde değiştirebiliriz. :)
Hatalar kullanıcı kaynaklısistem veya sizden kaynaklı olabilir.
Örneğin; En basitinden, iki adet textBox ve bir Buton lu programınızda kullanıcıdan sayısal değer alıp butona tıkladığında, bu girilen iki sayıyı toplatıp ekrana yazdıracaksınız. Ancak sayısal giriş yerine karakter girildiğinde program beklenmedik bir şekilde hata verecek ve kapanacak.
Akılda daha fazla kalsın diye test programımızı yapalım;
Sol tarafta gördüğünüz gibi programın kullanıcı arayüzü bu şekilde.

Kodlarımız aşağıdaki şekilde olsun;
?
1
2
3
4
5
6
7
private void btntopla_Click(object sender, EventArgs e)
{
    int sayi1 = Int32.Parse(txtilk.Text);
    int sayi2 = Int32.Parse(txtikinci.Text);
    int toplam = sayi1+sayi2;
    MessageBox.Show(toplam.ToString());
}
Programımızın bu şartlar altında çalıştığını görebiliriz;
Ancak program en ahmak kişiye göre yapılması gerektiğinden sayı yerine karakter girildiğinde aşağıdaki gibi bir hata verecektir;

İşte bu gibi hataların önüne geçmek için aşağıdaki kod blokları kullanılır;
?
1
2
3
4
5
6
7
8
9
10
11
12
try
{
Hatanın oluşabileceği kod satırları;
}
catch
{
Hata oluştuğunda çalıştırılacak kod satırları;
}
finally
{
Hata olsa da olmasa da çalıştıralacak kod satırları;
}
Mevcut kodlarımızı aşağıdaki şekilde düzenlersek;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void btntopla_Click(object sender, EventArgs e)
{
    try
    {
        int sayi1 = Int32.Parse(txtilk.Text);
        int sayi2 = Int32.Parse(txtikinci.Text);
        int toplam = sayi1 + sayi2;
        MessageBox.Show(toplam.ToString());
    }
    catch
    {
        MessageBox.Show("Lütfen sayı girişi yapınız", "Hata");
    }
}
Sonucuna varırız.

Exception

Programda olan hatalar Exception nesnesi içerisinden türetilir. Oluşan hataların ne olduğunu ayırt edebilmek için içerisinde hata bilgisi yazar. Yukarıdaki örnekte “Lütfen sayı girişi yapınız” yerine hatanın hangi sınıfa ait olduğunu yazdırabiliriz. İlerleyen zamanlarda daha kapsamlı bir proje yapacağınız zaman işinize yarayabilecek bir nesne.
Aşağıdaki gibi kodlarımızı değiştiriyoruz;
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void btntopla_Click(object sender, EventArgs e)
{
    try
    {
        int sayi1 = Int32.Parse(txtilk.Text);
        int sayi2 = Int32.Parse(txtikinci.Text);
        int toplam = sayi1 + sayi2;
        MessageBox.Show(toplam.ToString());
    }
    catch (Exception hata)
    {
        MessageBox.Show("Hata : \n" + hata.ToString());
    }
}
Çıktımız böyle olacaktır.

Hataları özelleştirmek isterseniz;

Tabii ki hataları isteğinize göre özelleştirebilirsiniz ancak Exception hata türlerini incelememiz gerekmektedir.
OverflowException : (taşıma hatası) Girilen değerin fazla olması durumunda meydana gelir. Biraz açacak olursak; byte değişken tipi “256″ sayı/karakter alır. Biz byte değişkenine “257″ gibi bir sayı atarsak programımız hata verecektir.
FormatException : (geçersiz format) Yukarıdaki örneğimizdeki görülen hatadır. Kullanıcıdan istenilen veri tipi bloğuna beklenenin dışında veri atandığında meydana gelir. “int” sayı veri tipine “string” değer atamak gibi bir işlem yaparsak programımız hata verecektir.
InnerException : İç hataları yakalamak için kullanılır. Eğer herhangi bir hata yakalanmaz ise null değeri içerir.
Source : Hatanın gerçekleştiği nesne hakkında bilgi verir.
DivideByZeroException : Sıfıra bölme hatası.
ArithmeticException : Aritmetik hata.

 Özelleştirme;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
private void btntopla_Click(object sender, EventArgs e)
{
    try
    {
        int sayi1 = Int32.Parse(txtilk.Text);
        int sayi2 = Int32.Parse(txtikinci.Text);
        int toplam = sayi1 + sayi2;
        MessageBox.Show(toplam.ToString());
    }
    //catch (Exception hata)
    //{
    //    MessageBox.Show("Hata : \n" + hata.Source);
    //}
    catch (OverflowException)
    {
        MessageBox.Show(" Sınırlanan değerlerden fazla bir değer girdiniz");
    }
    catch (FormatException)
    {
        MessageBox.Show("Sayı girdiğinizden emin olun");
    }
    catch (DivideByZeroException)
    {
        MessageBox.Show("Sıfıra bölünme hatası");
    }
    catch (ArgumentException)
    {
        MessageBox.Show("Aritmetik Hata");
    }
}
[alert-yellow] “Exception hata” olarak belirtilen kısımda hata.toString() yerine hata.Source kullanarak hatanın meydana geldiği yeri bulduk. Hatırlatmamda fayda var, catch (Exception hata) olarak belirlediğim için diğer hata satırları hata verir. Diğer satırların çalışması için açıklama satırı ekledim.[/alert-yellow]
[alert-green] Exception nesnesi tüm hataları listelenmiş halde adresinde http://msdn.microsoft.com/en-us/library/system.exception.aspx bulabilirsiniz.[/alert-green]

Finally Deyimi

Hata olup olmasa da çalışan kısım. Hata olursa catch kısmı Exception nesnesini işledikten sonra finally içerisine girdiğimiz değerler gözükür. Bu hata olmaması durumunda da gerçekleşir. Örneğin yukarıda yaptığımız toplama programda toplama işleminden sonra “Kullandığınız için teşekkür ederiz” şeklinde ekrana yazı yazdırabiliriz.
?
1
2
3
4
finally
{
    MessageBox.Show("Kullandığınız için teşekkür ederiz");
}

Isterseniz gelistirdigimiz programı indirebilirsiniz;

Kendinize iyi bakın, bir sonraki makalede görüşmek üzere.
İyi günler

Yorumlar