Veysel Uğur KIZMAZ

Checked, Unchecked ve Overflow Hata Kontrolü

16.06.2012Okunma Sayısı: 7130Kategori: C#.Net

 Bir değişkenin sınırları aşıldığında Overflow hatası verir veya beklemediğimiz sonuçlarla karşılaşırız. Mesela, çok büyük iki tam sayıyı çarptığımızda sonuç tamsayı türünün sınırlarını aşıyorsa doğru sonuç yerine değişik rakamlarla karşılaşırız. Bu durumların önüne geçebilmek için hata kontrollerinde checked - unchecked anahtar kelimelerini kullanacağız. Eğer çalışmasını istediğimiz kodu sadece try-catch bloğuna yerleştirirsek, unchecked ile eş değer olur ve sonucun hatalı olduğu konusunda bilgi sahibi olamayız. try-catch bloğunda ayrıca checked yerleştirirsek, overflow hatalarını kontrol etme imkanımız olmaktadır.

onuyu daha iyi anlayabilmek için çarpımı int sınırlarını aşan iki adet tam sayıyı çarpma işlemini gerçekleştirelim:

 
  1. int sayi1 = 1000000000;
  2. int sayi2 = 1000000000;
  3. MessageBox.Show((sayi1 * sayi2).ToString());
Bu kodda sonuç olarak 1000000000000000000 vermesi gerekirken görünen sonuç aşağıdaki gibidir:
Bu durumun bir hata olduğunu program bize söylemiyor. Peki biz nasıl bileceğiz?
Hepimizin ilk aklına gelen kodu try-catch bloklarına almaktır: 
  1. try
  2. {
  3.      int sayi1 = 1000000000;
  4.      int sayi2 = 1000000000;
  5.      MessageBox.Show((sayi1 * sayi2).ToString());
  6. }
  7. catch(Exception ex)
  8. {
  9.      MessageBox.Show(ex.Message);
  10. }
veya
 
 
  1. try
  2. {
  3. unchecked
  4. {
  5. int sayi1 = 1000000000;
  6. int sayi2 = 1000000000;
  7. MessageBox.Show((sayi1 * sayi2).ToString());
  8. }
  9. }
  10. catch(Exception ex)
  11. {
  12. string hata = ex.ToString();             
  13. MessageBox.Show(ex.Message,hata.Substring(0,hata.IndexOf(':')));
  14. }

Peki bu durumda hatayı tespit edebilecek miyiz?
 
Deneyelim:
Yine aynı sonucu verdi. Bu durum şunu göstermekte, aritmetik değişken türlerinde overflow hatası yerine değişik sonuçlar karşımıza çıkmaktadır.
Peki bu durumu tespit etmenin yolu yok mu?
try bloğuna aldığımız kodları aynı zamanda checked bloğuna da alalım:
  
  1. try
  2. {
  3. checked
  4. {
  5. int sayi1 = 1000000000;
  6. int sayi2 = 1000000000;
  7. MessageBox.Show((sayi1 * sayi2).ToString());
  8. }
  9. }
  10. catch(Exception ex)
  11. {
  12. string hata = ex.ToString();             
  13. MessageBox.Show(ex.Message,hata.Substring(0,hata.IndexOf(':')));
  14. }
Bu şekilde ne sonucu elde ettik?
checked anahtar kelimesiyle bu işlemin hatalı olduğunu öğrenmiş olduk. Bu durumda catch bloğunda Exception yerine OverflowException kontrolünü yapabiliriz.
 
 
Veysel Uğur KIZMAZ
Bilgisayar Mühendisi
veysel.ugurkizmaz.com