225 Görüntülenme

C# Try Catch Finally Nasıl Kullanılır? Ayrıntılı Anlatım

C# Try Catch Finally Nasıl Kullanılır? Ayrıntılı Anlatım
5 (100%) 1 Oy

C# Try Catch Finally Nasıl Kullanılır? Ayrıntılı Anlatım yazımız ile C# eğitimlerine devam ediyoruz. Try Catch, hata kontrolü yapmamızı sağlar. Try catch kullanmadığımızda programda bir hata çıktığında, ekranda bir hata mesajı görünür ve program durur. Ekrana çıkan hata mesajında , hatanın detaylarını görebilir, hatayı yok sayıp devam edebilir  yada programı kapatabiliriz. Hatayı yok saydığımızda sonraki işlemlerde hatalı devam edebilir bu sebeple devam edilmemesi önerilir. Kaldı ki programı sattığınız müşteriniz bu hatadan bir şey anlamayacak ve görmekten hoşlanmayacaktır. Örnek bir hata mesajını görelim.

C# hakkındaki diğer yazılarımı da merak ederseniz tıklayabilirsiniz.

Programlama hakkındaki yazılarıma da göz atabilirsiniz

c# try catch örnekleri

Örnek bir hata mesajı ekranı yukarıdaki görseldeki gibidir.

Bu hatayı aldığım kodları vereyim.

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

Form görüntüsü,

c# try catch kullanımı

Yukarıdaki hatanın sebebi bir rakam ile bir harfi toplamaya çalışmamızdır. “Giriş dizesi doğru biçimde değildi” nin anlamı “doğru değer girmedin”dir.

Şimdi, biz bu şekilde bir hata ekranı çıkmasını yerine bizim ayarladığımız bir mesaj çıksın istiyoruz. Bunu için hata yakalama kontrolü olan try catch kullanacağız. Bunun için visual studio da bir kısayolumuz var. Try catch bloğu içerisine almak istediğimiz kodları seçtikten sonra CTRL’ ye basılı tutar K ve S tuşlarına basıyoruz. Karşımıza bir liste çıkıyor. Başka bir tuşa basmadan “try” yazıp Enter dediğimizde seçtiğimiz kodları otomatik olarak try catch bloğu içerisine alıyor ve “Exception” bölümüne odaklanıyor.

Kodlarımız şu hale gelecek.

        private void btn_topla_Click(object sender, EventArgs e)
{
// string olarak gelen değerleri int tipine dönüştürdük.
try
{
int Sayi_1 = Convert.ToInt32(txt_sayi_1.Text);
int Sayi_2 = Convert.ToInt32(txt_sayi_2.Text);
int sonuc = Sayi_1 + Sayi_2;
lbl_toplam.Text = sonuc.ToString();
}
catch (Exception)
{
throw;
}
}

Şimdi gelelim bu kodlarda bir hata çıktığında gösterilmesini istediğimiz mesajı hazırlamaya.

        private void btn_topla_Click(object sender, EventArgs e)
{
// string olarak gelen değerleri int tipine dönüştürdük.
try
{
int Sayi_1 = Convert.ToInt32(txt_sayi_1.Text);
int Sayi_2 = Convert.ToInt32(txt_sayi_2.Text);
int sonuc = Sayi_1 + Sayi_2;
lbl_toplam.Text = sonuc.ToString();
}
catch
{
MessageBox.Show("İşlem yapılırken bir hata oluştu");
}
}

Örnek kodumuzdaki “(Exception)” kısmını silip “throw ” yazan kısma göstermek istediğimiz mesajı yazıyoruz.

MessageBox hakkında daha ayrıntılı bilgi için tıklayınız.

Kodlarımızı biraz açıklayalım. Şuan da kodlarda ne hata olursa olsun hep aynı mesaj çıkacak. Bu pek önerilen bir yöntem değil. Çünkü farklı birçok hata çıkabilir ve kullanıcıya farklı hatalarda aynı mesajı göstermek sorun çıkaracaktır. Örneğin matematiksel işlemlerde, hatalı dize giriş hataları, sıfıra bölme hataları gibi bir çok hata mevcut.

Şimdi diyeceksiniz “Hatanın C# dilindeki kontrolü nedir? Tamam giriş dizesi felan yazıyor ama try ile bunu nasıl yakayalacağız?” İşte bu soracağınız sorunun cevabı o hata mesajında yazmaktadır. Şimdi o hata mesajındaki “Ayrıntılar”  kısmını açalım.

c# try catch yapısı

Resimde sarı renk ile işaretlenmiş yerde hatanın C# tarafındaki adı yazmaktadır. “Giriş dizesi doğru biçimde değildi” hatasını “FormatException” ile yakalayacağız.

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

Kodlarımızı yukarıdaki şekilde düzenleyelim ve tekrar deneyelim.

c# try catch hata türleri

2 ile a yı toplamaya çalıştığımızda bize “Giriş dizesi doğru biçimde değildi” hatası veriyordu. Bu hatanın kodu ise “FormatException“‘du. Kod bloğumuzdaki Catch’e sadece FormatException hatalarını yakalamasını söyledik. Şuanda diğer hatalarda yine standart hata mesajını verecek.

Şimdi kodlarımızı ve formumuzu aşağıdaki şekilde değiştirelim.

Form;

c# try catch exception kullanımı

Kodlar;

        private void btn_topla_Click(object sender, EventArgs e)
{
// string olarak gelen değerleri int tipine dönüştürdük.
try
{
int Sayi_1 = Convert.ToInt32(txt_sayi_1.Text);
int Sayi_2 = Convert.ToInt32(txt_sayi_2.Text);
int Sayi_3 = Convert.ToInt32(txt_sayi_2.Text);
int sonuc = (Sayi_1 / Sayi_2) + Sayi_3;
lbl_toplam.Text = sonuc.ToString();
}
// sayı haricinde değer girilirse bu hatayı alırız.
catch (FormatException) 
{
MessageBox.Show("Lütfen sadece sayı giriniz.");
}
// bir sayıyı sıfır ile bölmeye çalışırsak bu hatau alırız.
// örn 1 / 0 gibi bir işlem olamaz.
// Telefonunuzdan yada bilgisayar hesap makinesi ile denerseniz hata verdiğini göreceksiniz
catch (DivideByZeroException) 
{
MessageBox.Show("Sayı 2, Sıfır değeri olamaz.");
}
}

Sayi_1 ile Sayi_2’i bölüp, Sayi_3 ile toplayacağız.

Şimdi sayı bire (1), sayı ikiye (0) ve sayı üçe (a) yazalım ve işlemi yap butonuna tıklayalım.  Alacağımız hata “DivideByZeroException” yani sıfırla bölme hatası olacaktı ancak bunu catch ile yakalayıp hatayı  “Sayı 2 Sıfır değeri olamaz” şeklinde gösterdik.. Bunun sebebi ise try da sadece yakalanan ilk hatanın gösterilmesidir. Siz buraya on tane de hata yakalama yazsanız ve tüm hatalarda o işlemde olsa sadece ilk yakaladığını gösterir. Kod kısmında yukarıdaki yada aşağıda olup olmaması önemli değildir. İsterseniz örnek kodumuzdaki  işlem satırında olan parantezleri kaldırıp (+) ile (/) yerlerini değiştirin. Bu sefer de “Lütfen sadece sayı giriniz.” hatası ekrana çıkacaktır.

Son olarak da kodlarımızı bu şekilde düzenleyelim.

        private void btn_topla_Click(object sender, EventArgs e)
{
// string olarak gelen değerleri int tipine dönüştürdük.
try
{
int Sayi_1 = Convert.ToInt32(txt_sayi_1.Text);
int Sayi_2 = Convert.ToInt32(txt_sayi_2.Text);
int Sayi_3 = Convert.ToInt32(txt_sayi_2.Text);
int sonuc = (Sayi_1 / Sayi_2) + Sayi_3;
lbl_toplam.Text = sonuc.ToString();
}
// sayı haricinde değer girilirse bu hatayı alırız.
catch (FormatException) 
{
MessageBox.Show("Lütfen sadece sayı giriniz.");
}
// bir sayıyı sıfır ile bölmeye çalışırsak bu hatau alırız.
// örn 1 / 0 gibi bir işlem olamaz.
// Telefonunuzdan yada bilgisayar hesap makinesi ile denerseniz hata verdiğini göreceksiniz
catch (DivideByZeroException) 
{
MessageBox.Show("Sayı 2, Sıfır değeri olamaz.");
}
catch
{
MessageBox.Show("Tanımlanamayan bir hata oluştu. Lütfen yazılım destek ile görüşünüz.");
}
}

Bildiğimiz tüm hataları yakaladık. Ancak daha farklı bir hata çıkarsa catch bloğuna düşecek ve yazdığımız hatayı gösterecek. Burada sizler hatayı kontrol edip, hata kodunu alıp onun içinde bir catch tanımalamanız gerekecektir..

Şimdi geldik Finally bloğuna. Onsan hiç bahsetmedik. Bana sorarsanız çok fazla kullanmayacağınız bir bloktur. Ama anlatmazsak olmaz. Sonuçta bu işlemi koymuşlarsa illaki bir yerlerde gerek olacaktır. Örnek kodlarımızı aşağıdaki gibi değiştirelim.

        private void btn_topla_Click(object sender, EventArgs e)
{
// string olarak gelen değerleri int tipine dönüştürdük.
try
{
int Sayi_1 = Convert.ToInt32(txt_sayi_1.Text);
int Sayi_2 = Convert.ToInt32(txt_sayi_2.Text);
int Sayi_3 = Convert.ToInt32(txt_sayi_2.Text);
int sonuc = (Sayi_1 / Sayi_2) + Sayi_3;
lbl_toplam.Text = sonuc.ToString();
}
// sayı haricinde değer girilirse bu hatayı alırız.
catch (FormatException) 
{
MessageBox.Show("Lütfen sadece sayı giriniz.");
}
// bir sayıyı sıfır ile bölmeye çalışırsak bu hatau alırız.
// örn 1 / 0 gibi bir işlem olamaz.
// Telefonunuzdan yada bilgisayar hesap makinesi ile denerseniz hata verdiğini göreceksiniz
catch (DivideByZeroException) 
{
MessageBox.Show("Sayı 2, Sıfır değeri olamaz.");
}
catch
{
MessageBox.Show("Tanımlanamayan bir hata oluştu. Lütfen yazılım destek ile görüşünüz.");
}
finally
{
lbl_toplam.Text = "İşlem tamamlandı";
}
}

Hiçbir hata çıkmadan hesaplamamızı yaptık. Try bloğunda toplamı lbl_toplam’ın text’ine yaz dedik. Ancak Finally bloğunda ise yine aynı label’in text’ine “İşlem Tamamlandı.” yazdık. İşlemi Yap butonuna tıkladığımızda label’de yazacak olan şey “İşlem Tamamlandı.” olacaktır. Bunun sebebini şöyle anlatalım. try catch finally kelimelerinin anlamlarına bakalım.

TRY = Dene

CATCH = Yakala

FINALLY = En Sonunda

Anlamanızda yeterli olacağını düşüyorum ama yine de açıklayalım.

Try’da yazdığımız kodları çalıştırdı, Bir hata çıktı ise catch bloğuna iner. Hata çıkmadı ise (varsa) finally bloğuna iner ve orada yazan kodları işletir.

NOT: Try Catch kontrolünde Finally bloğunu yazmak zorunda değilsiniz. 

Try Catch Finally standart kullanımı bu kadardı. Şimdi kod vermeden başka ne gibi işlemlerde kullanabilirsiniz senaryo olarak anlatayım.

1 – Bir tarayıcı ile belgeleri taramanızı ve bu belgeleri alıp tek bir pdf dosyası içerisinde göstermenizi istediler diyelim. Şimdi burada taranan kağıtların bittiğini nasıl bulacaksınız? Yani adam 1 belge de tarayabilir 100 belge de. Burada sizin tarama işlemi bitene kadar beklemeniz tarama bittikten sonra belgeleri birleştirmeniz ve ilgili klasörüne kopyalamanız gerek. İşte bu gibi durumlarda da try catch kullanabilir. Try bloğunda tarama işlemini yaptırırız. Kağıt bittiğinde ise tarayıcı kağıt bitti hatası gönderir. Bizde bu hatayı catch ile yakalar catch bloğunda kopyalama işlemini yaparız. Bu hatalar marka modele göre değişir bu sebeple bu hata kodlarını üretici firmadan istemelisiniz.

 

2 – Bir uygulama yazdınız. Bu uygulama bir laptopta ve sahada gezen bir personelde. Ve bu personel ise müşteriler ile yaptığı görüşmeleri programa kayıt etmesi gerek. Ancak ya gittiği yerde internet yoksa… Bu adam görüşmeleri nasıl şirketteki server’a kaydettirecek. İşte bu gibi durumlarda da try catch kullanabiliriz. try ile internet bağlantısını kontrol ederiz. Eğer internet var ise catch bloğuna geçmeyecen ve kayıt işlemini uzak server’a yapacak. İnternet yok ise catch bloğuna düşecek ve kayıt işlemini bilgisayardaki sql’e kaydedecek.

 

Nasıl? Örnekler mantıklı değil mi? Bu ve bunun gibi daha birçok senaryo var. Bu senaryolar çalıştığınız daha doğrusu program yazdığınız sektöre göre değişiklik gösterecektir. Benim karşılaştığım senaryolar bu şekildeydi.

Bu yazımızda bu kadar dostlar. Uzun bir yazı oldu ancak güzel bir yazı oldu diye düşünüyorum. Umarım try catch ‘ı iyice sizlere anlatabilmişimdir. Rahatça anladıysanız ne mutlu bana.  😀

C# hakkındaki diğer yazılarımı da merak ederseniz tıklayabilirsiniz.

Programlama hakkındaki yazılarıma da göz atabilirsiniz

Sağlıcakla ve takipte kalın 😉

Liseden, Ağ Sistemleri ve Yönetimi bölümünden mezun oldum. Üniversiteden (2 yıllık), Bilgisayar Programcılığı bölümünden mezun oldum. Şuanda da AÖF, Yönetim Bilişim Sistemleri bölümünde okumaktayım.

Uzmanlık alanlarım; Windows Sistemleri, HTML, CSS, C# ve SQL’dir.

Hobi olarak uğraştığım genel konular, Photoshop, After Affects, Corel Draw’dır.Film, YABANCI dizi, Anime izlemeyi ve Manga okumayı severim. Arkadaşlarımla yürüyüş yapmayı ve grup olarak aktivitelere gitmeyi severim. Geri kalan zamanlarımın tümü bilgisayar karşısında geçer.