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.

Konuyu 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:

int sayi1 = 1000000000;
int sayi2 = 1000000000;
MessageBox.Show((sayi1 * sayi2).ToString());

Bu kodda sonuç olarak 1000000000000000000 vermesi gerekirken görünen sonuç aşağıdaki gibidir:

checked-unchecked-ve-overflow-hata-kontrolu-1

checked-unchecked-ve-overflow-hata-kontrolu-1

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:

 

try
{
int sayi1 = 1000000000;
int sayi2 = 1000000000;
MessageBox.Show((sayi1 * sayi2).ToString());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}

veya

 

try
{
unchecked
{
int sayi1 = 1000000000;
int sayi2 = 1000000000;
MessageBox.Show((sayi1 * sayi2).ToString());
}
}
catch(Exception ex)
{
string hata = ex.ToString();             MessageBox.Show(ex.Message,hata.Substring(0,hata.IndexOf(‘:’)));
}


Peki bu durumda hatayı tespit edebilecek miyiz?

Deneyelim:

checked-unchecked-ve-overflow-hata-kontrolu-2

checked-unchecked-ve-overflow-hata-kontrolu-2

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:

try
{
checked
{
int sayi1 = 1000000000;
int sayi2 = 1000000000;
MessageBox.Show((sayi1 * sayi2).ToString());
}
}
catch(Exception ex)
{
string hata = ex.ToString();
MessageBox.Show(ex.Message,hata.Substring(0,hata.IndexOf(‘:’)));
}

Bu şekilde ne sonucu elde ettik?

checked-unchecked-ve-overflow-hata-kontrolu-3

checked-unchecked-ve-overflow-hata-kontrolu-3

checked anahtar kelimesiyle bu işlemin hatalı olduğunu öğrenmiş olduk. Bu durumda catch bloğunda Exceptionyerine OverflowException kontrolünü yapabiliriz.