Try Catch – Exception Yönetimi

Try Catch bir hata yakalama yöntemidir. Yazdığınız kod bloğunda bir hata oluştuğu zaman size hatayla ilgili bilgi veren bir Exception fırlatır. Try bloğunun içinde denetlemek istediğiniz kod bloğu olur. Catch kısmında ise hata yakalama yönetimi olur. Biz bu yazımızda bu hataları nasıl yakalarız bunlara bakacağız. İlk olarak kısaca bir try catch bloğu örneği yapalım.


try
{
//Denetlenecek kod bloğu
}
catch (Exception ex)
{
//Hatayla karşılaşmamız durumunda, hatanın yakalanacağı blok.
//catch içine yazılan Exception en genel kullanılan hata denetimidir.
//Biz özel hatalar için  Exception yöneteceğiz.
//Eğer yönetimini sağlamazsak Exception bize bunu yapar. Bütün hata 
//çeşitlerini yakalar ama 
//doğru olan bu hataları kendi yönetimimiz ile yakalamaktır. 
//Tek tek bu hataları kontrol etmektense,
//direkt hatanın Exception'ını yazmak performans olarak daha iyidir.
}

Başlık başlık gideceğim. İşleyeceğimiz çok Exception yöntemi var. Yazabildiklerime Try-Catch kodlarıyla destek vereceğim ki daha net anlaşılsın. Dil olarak C# kullanacağım. Bütün yöntemleri doğru işlersek güzel bir yazı olacak diye umuyorum.

1) Argument Out Of Range Exception


Evet ilk Exception türümüz. Exception türlerinin adlarına bakarak bir yorum yapabilirsiniz. Örneğin,

Argument = Argüman

Out Of Range= Alan dışında, dizi dışında vb.

Yani yazdığımız kod bloğunda bir taşma söz konusu, Length parametresi alan bir metot yazalım ve olması gerekenden daha fazla bir length değeri verelim.


try
{
IntPtr pointerBurak = new IntPtr(31);
string Gelen = Marshal.PtrToStringUni(pointerBurak, 1);
}

catch(ArgumentOutOfRangeException ex)
{
MessageBox.Show(ex.Message);
}

Evet yukarıda böylece hatayı yakalamış olduk. Hata satırına bakarsanız yani ex içine girerseniz ayrıntılı bir hata mesajı ve bilgisi göreceksiniz.

2) Index Out Of Range Exception


Adından da anlaşılacağı gibi Index taşmasıdır. Bir dizi tanımlayacağım ve dizinin olmayan index’ine bir değer ataması yapacağım. O da bana diyecek ki hoooop yavaş 🙂  Şimdi kodlarımızı yazalım haydi.


try
{
int[] dizi = new int[1];
dizi[2] = 1;
}

catch (IndexOutOfRangeException ex)
{
MessageBox.Show(ex.Message);
}

3) Out Of Memory Exception

Hafıza yetersiz hatası. Siz açtığınız alandan daha fazlasını kullanmak isterseniz bu hata fırlar. Out of memory ‘den de anlayacağınız gibi hafızanın dışına çıktınız diyor. Haydi şimdi bu hatayı aldıralım.


 try
 {
 StringBuilder sb = new StringBuilder(15, 15);
 sb.Append("Substring #1 ");
 sb.Insert(0, "Substring #2 ", 1);
 }
 catch (OutOfMemoryException ex)
 {
 MessageBox.Show(ex.Message);
 }

4) No Null Allowed Exception

Bu hata biraz özel bir hata denetimi. Açıklamasında şöyle diyor: Eğer siz bir row insert ederken null değer giriyorsanız ve DataColumn.AllowDbNull değerini false yaptıysanız bu hatayı alırsınız. True yaparsanız tablonuzun satırına null ataması yapabilirsiniz. Hemen örnek kod yazalım;


try
{
DataTable table = new DataTable("Product");

DataColumn column = new DataColumn();
column.DataType = System.Type.GetType("System.Decimal");
column.AllowDBNull = false;//bu değer true olursa null ataması yapabiliriz.
column.Caption = "Para";
column.ColumnName = "Para";

table.Columns.Add(column);

DataRow row;

row = table.NewRow();
row["Para"] = DBNull.Value;
table.Rows.Add(row);
}
catch (NoNullAllowedException ex)
{
MessageBox.Show(ex.Message);
}

5) Stack Over flow Exception

Evet, geldik ismi en çok bilinen hatamıza. Yani şuan bilmiyor olabilirsiniz ama Türkiye’de orta düzey firmaların projelerinin kaynak kodlarını oluşturan site 🙂 Stackoverflow kesinlikle harika yararlı. Lafı çok uzatmadan hatamıza gelelim. Yığın taşması desek yanlış olmaz. Kendini çağıran rekürsif bir metot yazacağım fakat kadere bakın ki bu metot kendini durmadan çağırıyor. Sonsuza kadar bu böyle gidecek mi? Hayıııır tabi ki hata verecek çünkü metot yığın bellekte taşmaya sebep olacak. Haydi kodumuza bakalım.


Recursive(0);
void Recursive(int Deger)
{
try
{
Recursive(Deger++);
}
catch (StackOverflowException ex)
{
MessageBox.Show(ex.Message);

}

}

Kendini çağıran metotların bir sonlanma durumu olmalıdır. Ek olarak eklemek istedim.

6) Divide By Zero Exception

Allah’ım bu ne havalı bir isim. Keşke benim ismim bu olsaydı. Temel matematik bize, bir sayının sıfıra bölümü tanımsızdır diyor. İşte tam olarak bu hata bunu veriyor. Bir sayıyı sıfıra bölmek istediğinizde boooom hata yakalıyorsunuz.


 try
 {
 int bolunen = 31;
 int bolen = 0;
 int bolum = bolunen / bolen;
 }
 catch (DivideByZeroException ex)
 {
 MessageBox.Show(ex.Message);
 }

7) Invalid Operation Exception

Bir fonksiyon yazalım sizle. Fonksiyon parametre olarak milisaniye alsın. Fonksiyon içinde bu saniye kadar Delay edelim yani geciktirelim. Hemen fonskiyonu çağırdığımız satırın altında fonksiyonu Threading yöntemiyle asenkron çağıralım. Ayrıca bu fonksiyon içinde bir Textbox nesnemize değer ataması yapalım. Neler olur çalıştırırsak? Textbox nesnemizin Text alanını birden fazla istekle değiştirmek istemiş olmaz mıyız? O zaman ne olacak? Program hangisini yazacak? İşte hatamız tam olarak bu 🙂 Karışık olmamıştır inşAllah.


Fonksiyon(20);

Task.Run(() => Fonksiyon(500));

async void Fonksiyon(int miliSaniye)
{
try
{

await Task.Delay(miliSaniye);

var Mesaj = String.Format( miliSaniye.ToString() );

TxtModel.Text += Mesaj;

}
catch (InvalidOperationException ex)
{
MessageBox.Show(ex.Message);

}

}

8) Null Reference Exception

En çok gördüğünüz hata değil mi bu ya? 🙂 Null alanlar başımızın belası tam anlamıyla. Bir işlem yaparken bazen işlem yaptığımız yani referans aldığımız nesne, değişken null değerde olursa bu hatayı alırız.

 try
 {
 string Deger = null;
 Deger.ToString();
 }
 catch (NullReferenceException ex)
 {
 MessageBox.Show(ex.Message);
 }

9) Format Exception

Adından da anlaşılacağı gibi Format hatasıdır. Bir String değişken tanımlayıp bu değişkene karakter ataması yapalım sonra Int türüne convert edelim. Doğal olarak Format hatası alacağız.

try
{
String Deger = "Deger";
int IntDeger = Convert.ToInt32(Deger);
}
catch (FormatException ex)
{
  MessageBox.Show(ex.Message);
                
}

10) Burak Exception 🙂

Geldik son başlığımıza. Toplam yüz ( 100 ) Exception türü olduğunu düşünürsek ben onda birini yazdım. Son başlığa kendime bir exception yazıp paylaşmak istedim. Kısaca anlatmak gerekirse bir Exception klası yaptım. Bu exception klasının da Message özelliğine kendim bir mesaj ekledim. Hani o ex.Message dediğiniz Message 🙂


public class BurakException : Exception
{
public override string Message => "Burak SEÇER Hatası!";
}

 <span data-mce-type="bookmark" style="display: inline-block; width: 0px; overflow: hidden; line-height: 0;" class="mce_SELRES_start"></span>

try
{
throw new BurakException();
}
catch (BurakException ex)
{
MessageBox.Show(ex.Message);

}

Geldik yazımızın sonuna. Şimdi son örneğimizi aşağıya bırakıyorum. Yazının en önemli örneği. Eğer bu exception yönetimini sağlamazsak ne olur? Ben rastgele bir hatalı kod yazacağım. Yazdığım kodun Catch kısmına Exception dersem hatanın ne olduğunu anlamak için 100 tane Exception türünden hangisi olduğunu bulması lazım değil mi? Peki ben oluşabilecek hataları ön görüp Exception türümü kendim yazsam? O zaman 1/100 daha hızlı erişmez miyim? Haydi bakalım,

           try
            {
                string Deger = null;
                Deger.ToString();
            }
           
            catch (BurakException ex)
            {
                MessageBox.Show(ex.Message);

            }
            catch (InvalidOperationException ex)
            {
                MessageBox.Show(ex.Message);

            }
            catch (DivideByZeroException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (StackOverflowException ex)
            {
                MessageBox.Show(ex.Message);

            }
            catch (NoNullAllowedException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (OutOfMemoryException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (NullReferenceException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (IndexOutOfRangeException ex)
            {
                MessageBox.Show(ex.Message);
            }
            catch (ArgumentOutOfRangeException ex)
            {
                MessageBox.Show(ex.Message);
            }

Ben işlediğimiz başlıkları catch kısmına ekledim ama olması gereken alakalı hataların yazılması. Bu kod satırında DivideByZeroException yazmanın bir anlamı olmayacaktır. Cumartesiyi pazara bağlayan gece saat 02:23. Blog yazmayı seviyorum yoksa tatil günü bu saatte uyurdum galiba 🙂 Umarım güzel ve yararlı bir yazı yazmışımdır. Herkese iyi tatiller.

2 thoughts on “Try Catch – Exception Yönetimi

  1. Tam beklediğim gibi bir yazı olmuş, sondaki kendi exception’ı yazma örneği bi hayli işe yarar. Bazı şeyleri kendimiz yönetmeyelim sonuçta. Ellerine sağlık. (Örnekler diğer oop dillerinde de kolayca uygulanabilir 🙂 )

    1. Teşekkür ederim 🙂 Umarım arkadan gelen genç arkadaşlar basma kalıp kodlar yerine biraz daha özgün kodlar geliştirirler. Burak Exception hatası alırsanız beni arayın 🙂

Bir Cevap Yazın