C# Hata Ayıklama Try-Catch

Program çalışırken hemen hemen her aşamasında hatalar meydana gelebilir. Kod parçalarının her zaman beklenildiği gibi çalışacağından emin olmak oldukça zordur. Bu hatalar kişiden kaynaklanabileceği gibi kişinin dışından da kaynaklanabilir. Bilgisayara bir program kurulduğu düşünülsün. Çok gerekli bir program olsa da sürekli programda hatalarla karşılaşılırsa ne kadar gerekli olursa olsun, bir daha bu program kullanılmak istenilmez. Oysa programın hataları giderilmiş, hata verdiğinde hatanın nedeninin ne olduğu söyleniyorsa elbette ki bu programı kullanmak kişiye daha yakın gelecektir. O nedenle de
hataların programdan ayıklanması son derece önemlidir.

Try – Catch Bloku

Hataları yakalamadan bir program yazılarsa yukarıda da açıkça belirttiğimiz gibi insanlar bu programı kullanmak istemez. Try catch yapısı hata yakalama, hata ayıklama olarak da bilinir. Normal şartlarda program hata oluştuğu anda uygulamamız patlar ve kendini kapatır. Bunu önlemek amacıyla try catch yapısını kullanmak zorundayız.

Kullanımı :

[csharp]
try
{
Hata olmadığı sürece çalışacak kodlar;
}
catch (özel durum)
{
Hata oluştuğunda çalışacak kodlar;
}[/csharp]

Yukarıdaki söz diziminde görüldüğü gibi normal kodları try bölümüne, herhangi bir hata oluştuğunda ise bu gibi durumları yakalamak için de catch bölümüne yazılmalıdır.Buradaki özel durum ise hatanın nedenini yakalamak için kullanılan bir ifadedir.

Örnek :

[csharp]
try
{
int s1 = Convert.ToIntl6(textBoxl.Text);
int s2 = Convert.ToInt16(textBox2.Text);
label3.Text = “Sonuç: ” + (s1 + s2);
}
catch (Exception hata)
{
label5.Text = “Hata! ” + hata.Message;
}[/csharp]

Birden Çok Catch Bloku

.NET Platformu tarafından sağlanan özel durum kütüphanesi oldukça kapsamlıdır..NET Platformunda birçok özel durum tanımlanmıştır ve yazılan herhangi bir programda bu özel durumlarla karşılaşma oranı son derece yüksektir. Örneğin, yazılan bir programda metinsel veriyi sayısal bir veriye dönüştürme özel durumu ile karşılaşılabilir. Bunun yanında int16 veri türüne sahip bir değişkene int32 kapsamındaki bir veriyi (overflow, taşma hatası) atama gibi bir özel durumla da karşılaşılabilir. Bunun gibi daha birçok özel durumla karşılaşma durumu söz konusudur. Karşılaşılan her bir özel durum için ayrı ayrı try-catch bloku yazmak elbette son derece mantıksızdır. Bunun yerine aynı try-catch blokunda farklı catch bölümler kullanılabilir.

Kullanımı:

[csharp]try
{
Hata olmadığı sürece çalışacak kodlar;
}
catch (özel durum – 1)
{
İlgili hata oluştuğunda çalışacak kodlar;
}
catch (özel durum – 2)
{
İlgili hata oluştuğunda çalışacak kodlar;
}[/csharp]

En sık kullanılan üç özel durum aşağıda yer almaktadır.

  •  FormatException: Sayısal veri türüne sahip bir değişkene bir harf girilmesi veya atanması
  •  OverflowException: Bir değişkene atanan veya girilen sayı, değişkenin tanımlandığı veri türünün alabileceği aralığın dışında kalması
  • ArgumentNullException: Sayısal veri türüne sahip bir değişkene null değerini atamak

[csharp]
try
{
int s1 = Convert.ToInt16(textBox1.Text);
int s2 = Convert.ToInt16(textBox2.Text);
label3.Text = “Sonuç: ” + (s1 + s2);
label5.Text = “”;
}
catch (FormatException fhata)
{
label5.Text = “Hata! Lütfen alanlara sayısal veriler giriniz”;
}
catch (OverflowException ohata)
{
label5.Text = “Hata! Alanlara çok büyük sayılar giriyorsunuz”;
}[/csharp]

Denetlenmiş ifadeler

Belirtilen sınırların dışında bir sayıyı int türünde bir değişkende tutmak istersek taşma meydana gelir. Eğer -2.147.483.648 sayısından daha küçük bir sayı tutulmak istenirse underflow, 2.147.483.647 sayısından büyük bir sayı tutulmak istenirse overflow durumu oluşur. Genel olarak her iki durum da overflow olarak adlandırılmaktadır. Varsayılan olarak programlama dili derleyicisi taşma problemlerinde yanlış değer üreten bir yapıya sahiptir.

Örnek :

[csharp]
int sayi1 = 1000000000;
int sayi2 = 1000000000;
MessageBox.Show((sayi1 * sayi2).ToString());[/csharp]

Bu işlemin sonucu 1000000000000000000 olması gerekirken program sonuc olarak bu sayıyı verecektir.
-1486618624

İşte burada bir taşma meydana gelmiştir. Bu taşmanın önüne geçmek için iki seçenek mevcuttur. Bunlardan ilki programlama dilinin derleyicisini projelerdeki taşma problemlerine karşı etkin hâle getirerek yanlış sonuç üretmesi yerine hata ile kesilmesi sağlanabilir. İkinci seçenek ise checked ifadesiyle kodlama esnasında bu işlemi yapmaktır.

İlk seçenek için şu adımlar uygulanır: Programda Project menüsünden Projeniz Properties seçeneği seçilir (Projeniz, projenin adıdır.). Proje özellikleri iletişim kutusunda, Build sekmesi tıklanır. Sayfanın sağ alt köşesindeki Advanced düğmesi tıklanır. Advanced Build Settings iletişim kutusunda, Check for arithmetic overflow/underflow onay kutusu işaretlenir. Bundan böyle projeniz taşma problemine karşı etkin hâle gelmiş olacaktır.

İkinci seçenek ise bu işi kodlamayla gerçekleştirmektir. Eğer proje özeliklerindeki Check for arithmetic overflow/underflow seçeneği işaretli değilse ve programın yanlış değer üretmesi istenmiyorsa bu durumda checked ifadesi kullanılmalıdır.

Örnek :

[csharp]int sonuc;
int sayi1 = 1000000000;
int sayi2 = 1000000000;
checked
{
sonuc = sayi1 * sayi2;
}
Console.WriteLine(sonuc);
Console.ReadKey();[/csharp]

Kodlamaya göre programın çalışması esnasında checked blokunda yer alan aritmetiksel işlemde taşma olduğunda, program hata verecektir. Burada yapılan şudur: Programdaki bazı kodlar, oluşabilecek taşmalardan dolayı hatalı sonuçlar üretilmesinin önüne geçilmiştir.Programın çalıştırdığınızda kesilerek hata verdiği görülecektir. Eğer programın hata sırasında kesilmesi istenmiyorsa try-catch bloku kullanılarak hata yönetilebilir.

Bazı durumlarda ise programın taşma hatası vermesi yerine, ne olursa olsun bir sonuç üretmesi sizin için önemli olabilir. Böyle bir sonucu almak için proje özelliklerindeki Check for arithmetic overflow/underflow seçeneğinin seçili olmaması gerekmektedir. Eğer bu seçenek seçili ise bu durumda unchecked ifadesi ile yanlışta olsa bir sonuç alınabilir. Aritmetiksel işlemi unchecked ifadesi
ile denetim dışına çıkararak bu işlemi gerçekleştirebilirsiniz.

Örnek :

[csharp]int sonuc;
int sayi1 = 1000000000;
int sayi2 = 1000000000;
unchecked
{
sonuc = sayi1 * sayi2;
}
Console.WriteLine(sonuc);
Console.ReadKey();[/csharp]

Görüldüğü gibi kodlamadaki aritmetiksel işlem denetim dışı bırakılmıştır. Böylece aritmetiksel işlemde meydana gelebilecek bir taşmada program hata vermeyecek, yanlış da olsa bir sonuç üretecektir.

 

Kaynak: Megep Modülleri

Ahmet Şenlik

Kocaeli Üniversitesinde Bilgisayar Programcılığı okudum DGS ile 2016 yılında Sakarya Üniversitesi Bilgisayar mühendisliğini kazandım. Yazılımla uğraşmayı çok seviyorum bu alanda kendimi daha da geliştirmeyi düşünüyorum. Eğer siz de seviyorsanız bu işi devam edin başlamadıysanız başlayın başaracağınıza inanın. :)

You may also like...

2 Responses

  1. ertuğrul dedi ki:

    teşekkür

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bu site, istenmeyenleri azaltmak için Akismet kullanıyor. Yorum verilerinizin nasıl işlendiği hakkında daha fazla bilgi edinin.