C# Try Catch Finally Kullanımı (Ayrıntılı)

C# Try Catch Finally Kullanımı (Ayrıntılı)

Hata yakalama amacı ile kullanırız. Örn hata çıkabilecek bir kısımda kullanıcının anlamadığı yazılar yerine istediğimiz bir mesajı gösterebiz.

Selam arkadaşlar.

Projelerimizde hata çıkması muhtemel kısımlarda try catch finally kontrolünü kullanırız. Bu bize hataları yönetme yada bir amaç için kullanmamıza olanak sağlar. try catch finally kullanılmamış bir yerde hata çıktığında karşımıza gelen hata mesajını bilirsiniz. Yazılımcılar anlamlı fakat kullanıcılar için anlamsız yazılar yazan bir mesajdır. Bu dersimizde bu try catch finally hangi durumlarda nasıl kullanacağımızı ve yöneteceğimizi göstermeye çalışacağım. Çok ayrıntılı bir ders olmayacaktır.

Projemizde yeni bir form açtıktan sonra 2 adet textbox 1 adet label 1 adette buton ekleyelim. Yapacağımız işlem textboxlara yazılan sayıların toplamlarını labele yazdırmak olacaktır.

Butonumuzun click eventine şu kodları yazalım;

private void Button1_Click(object sender, EventArgs e) 
{
   // string olarak gelen değerleri int tipine dönüştürdük.
   int Sayi_1 =    Convert.ToInt32(TextBox1.Text);
   int Sayi_2 =    Convert.ToInt32(TextBox2.Text);  
   int sonuc = Sayi_1 + Sayi_2 ;
   label1.Text = sonuc .ToString();
}

Toplama işlemimizi yaptık. Şimdi toplama işlemini yaparken Text alanlar arasında toplama işlemi yapamayız. Çünkü sayı yazmış da olsa metin olarak algılanır ve " + " kullandığımızda iki sayıyı yan yana yazar. Toplama işlemi için convert işlemi yani dönüştürme işlemimi yaptık. Toplamayı yaptıktan sonra sonucu yine Text(string) olarak tekrar convertledik. Bunu da yapmazsak sayıyı labelin Text'ine atayamayız.

Şimdi butona tıkladığımızda toplama işlemini yapıp labelin text'ine yazacak. Bunda bir sorun çıkmaz.

Lakin textboxlardan birine harf de yazarsak ne olur?

işte bu şekilde bir hata alırız. Bu hata bir convert hatasıdır. 

Bu hatanın görünmesini önlemek için 2 yolumuz var. 

1. Textboxları sayı girilemeyecek şekilde ayarlamak.

2. Try Catch Finally kullanmak

İşte burada  Try Catch işin içine girer.

Şimdide aynı kodu Try Catch ile yazalım.

private void Button1_Click(object sender, EventArgs e) 
{
          try
         {
               // string olarak gelen değerleri int tipine dönüştürdük.
               int Sayi_1 =    Convert.ToInt32(TextBox1.Text);
               int Sayi_2 =    Convert.ToInt32(TextBox2.Text);  
               int sonuc = Sayi_1 + Sayi_2 ;
               label1.Text = sonuc .ToString();
         }
         catch 
         {
                MessageBox.Show("Lütfen sadece sayı yazınız.");
         }
}

Aynı hatalı işlemi tekrar denediğimizde bu sefer karşımıza kendi yazdığımız mesaj gösterilecektir. Try i örnekteki gibi kullandığımızda hatanın türü ne olursa olsun hep bizim gösterdiğimiz mesaj çıkacaktır. Lakin Try Catch bu kadar basit değil. C# içerisindeki oluşabilecek tüm hata türlerini aynı anda kontrol edebilir her hata türünde farklı mesajlar gösterebiliriz. Ona birazdan bakalım ondan önce kendi mesajımız ile birlikte hatanın da ne olduğunu göstermek istersek kodumuzu aşağıdaki gibi düzenleyelim.

private void Button1_Click(object sender, EventArgs e) 
{
   try
         {
               // string olarak gelen değerleri int tipine dönüştürdük.
               int Sayi_1 =    Convert.ToInt32(TextBox1.Text);
               int Sayi_2 =    Convert.ToInt32(TextBox2.Text);  
               int sonuc = Sayi_1 + Sayi_2 ;
               label1.Text = sonuc .ToString();
         }
         catch (Exception Ex)
         {
                MessageBox.Show("Lütfen sadece sayı yazınız." + Environment.NewLine + Ex.ToString());
         }
}

Yukarıdaki örnekteki kodda hata çıkacak olursa bizim yadığımız mesajın alt satırında da hatanın ne olduğunu bize yazacaktır. 

Hep Try Catch dedik nerde bu Finally? Birde ona görelim;

private void Button1_Click(object sender, EventArgs e) 
{
   try
         {
               // string olarak gelen değerleri int tipine dönüştürdük.
               int Sayi_1 =    Convert.ToInt32(TextBox1.Text);
               int Sayi_2 =    Convert.ToInt32(TextBox2.Text);  
               int sonuc = Sayi_1 + Sayi_2 ;
               label1.Text = sonuc .ToString();
         }
         catch (Exception Ex)
         {
                MessageBox.Show("Lütfen sadece sayı yazınız." + Environment.NewLine + Ex.ToString());
         }
         finally
        {
               Sayi_1  = 0;
               Sayi_2  = 0;
               sonuc  = 0;
              label1.Text   = "İşlem Yapılmadı";

        }
}

Finally bloğunu da işlemler bittikten sonra yapılmasını istediklerimizi yazabiliriz. Yani try içerisindeki işlemleri yapmaya çalıştı olmadı Catch bloğuna düştü hatayı gösterdi, yada işlem hatasız yapıldı. Bu işlemden sonra hata verse de vermesede yapılmasını istediğiniz bir işlem varsa onları Finally bloğunda yapıyoruz.

Şimdi aynı anda birden fazla hata kontrolünü nasıl sağlarız ona bakalım. Aynı zamanda da çoklu Cacth kullanımı da yapmış oluyoruz

NOT 1: Bunu kullanabilmek için Exception'lar hakkında bilgi sahibi olmalıyız. Yani hangi tür hata hangi işlemlerde oluşabilir gibi. Örn bir toplama işleminde "0'a bölünme hatası" kontrolü yapmamız gereksiz olacaktır. Örn. Aşağıdaki örnekte "OverFlowException " gereksiz bir kontroldür. Yazmamın amacı çoklu kullanım şeklini göstermektir.

NOT 2: Bir hata oluştuğunda ard arda iki Catch bloğu çalışmaz. Denemeyi yapar hata varsa ilgili bloğa düşer oradaki işlemlerden sonra da varsa Finally bloğunu işler ve bitirir.

Görelim;

private void Button1_Click(object sender, EventArgs e) 
{
   try
         {
               // string olarak gelen değerleri int tipine dönüştürdük.
               int Sayi_1 =    Convert.ToInt32(TextBox1.Text);
               int Sayi_2 =    Convert.ToInt32(TextBox2.Text);  
               int sonuc = Sayi_1 + Sayi_2 ;
               label1.Text = sonuc .ToString();
         }
         catch (OverFlowException Ex_1)
         {
           //Taşma hatası meydana gelirse çalıştırılacak kod bloğu
           MessageBox.Show("Bir taşma hatası meydana geldi." + Environment.NewLine + Ex.ToString());
         }
         catch (ArithmeticException Ex_2)
         {
             //Aritmetiksel hata meydana gelirse çalıştırılacak kod bloğu
             MessageBox.Show("Aritmetiksel  bir hata meydana geldi." + Environment.NewLine + Ex.ToString());
         }
         Catch (Exeption Ex)
         {
            MessageBox.Show("Lütfen sadece sayı yazınız." + Environment.NewLine + Ex.ToString());
         }
         finally
        {
               Sayi_1  = 0;
               Sayi_2  = 0;
               sonuc  = 0;
              label1.Text   = "İşlem Yapılmadı";

        }
}

Şimdi bunu başka nasıl işlemlerde kullanabiliriz ona da bakalım.

Yukarıdaki işlem ilk örnekti. İkinci örnekte kod olarak değil senaryo olarak anlatacağım.

Diyelim ki bir projenizde müşteri sizde 10 15 sayfayı taradıktan sonra tek pdf olarak kaydedip programda görmek istediğini söyledi. Şimdi böyle bir işlemde tarama işleminin bittiğini nasıl anlayacaksınız? İşte Try burada imdadımıza yetişiyor. 

1 - Try içerisinde kağıt tarama işlemini yaptırırsınız.

2 - Kağıt bittiğinde tarayıcı kağıt bitti hatası geri döndürecek ve Catch bloğuna düşecek. (Bu hataları tarayacının üretici firmalarından yada internetten bulabilirsiniz.)

3 - Ve Catch Bloğunda da kayıt işlemini yapacaksınız. Çünkü tarama bitti ve pdf in oluşturulup kaydedilmesi gerekiyor. Bunuda Catch bloğunda hallediyoruz.

 

Başka bir örnek ise;

Diyelim ki projenizde hata logları tutmak istiyorsunuz. Bunu Try ile halledebilirsiniz. Yukarıdaki örnekte te anlattığım gibi bir işlemle bu işinizide halledebilirsiniz.

Tabi Try içinde UPDATE işlemi başarısız olursa bu hatayı Catch'da log tablosuna INSERT  gibi birşey yapmayın. bu log kaydını bir TXT dosyasına atabilirsiniz. Dilerseniz update edilmeye çalışan bilgileri de txt belgesine yazdırabilir o anda oluşacak veri kaybını önleyebilirsiniz.

Bu ders bu kadar sevgili arkadaşlar umarım faydalı olur.

Yorumlarınızı eksik etmeyin arkadaşlar. Artılarımı ve eksilerimi söylemekten çekinmeyin.

Mustafa BÜKÜLMEZ
Web sitesi ve ERP, MRP, CRM ve kişiye özel uygulamalar uygun fiyatlarla hazırlanır. Fİyat için mesaj atabilirsiniz. -- Deneyip çalıştığını onaylamadan çok nadir ders eklerim. Denemediklerim ise eski makalelerimdendir. Hem bildiklerimi paylaşmak hemde her seferinde aramamak için yayınlıyorum. -- *Bilgi paylaştıkça çoğalır. *Bir mum diğer mumu yakmakla ışığından bir şey kaybetmez. Aksine Daha çok ışık yayar. -- 1992 İstanbul doğumluyum. Kahramanmaraş'ta yaşıyorum. Lise: Ağ sistemleri ve Yönetimi, Üniversite: Bilgisayar Programcılığı.. -- 07.2014 tarihinden beri bir firmada Bilgi İşlem Müdürü olarak çalışmaktayım. -- Kişisel Bloğum : https://csharpiledundenbugune.blogspot.com.tr/
Yorum Yaz

Yorum yazabilmek için üye girişi yapmanız gerekiyor!

Yukarı Git