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.
}
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.
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ı");
}
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ı");
}
FINALLYKullanmak ş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;
}
Hiç yorum yok:
Yorum Gönder