C# Try-Catch-Finally Blokları ile Hata Yakalama

Noises

Üye
22 Ağu 2017
165
0
26
Balıkesir
Tüm programlama dillerinde olduğu gibi C# dilinde de programın çalışma zamanında meydana gelecek hataları engellemeye yarayan yöntemler bulunmaktadır. Try-catch-finally blokları C#’da hataları yakalamak için en fazla kullanılan kod bloğudur.

Kod:
Try{
[COLOR="Lime"]//Hata oluşabilecek kodlar[/COLOR]
}
Catch{
[COLOR="lime"]//Hata oluştuğunda çalışacak kodlar[/COLOR]
}
Finally{
[COLOR="lime"]//Her halükarda çalıştırılacak kodlar[/COLOR]
}

Try-Catch-Finally Bloklarının Çalışma Şekli
Hata oluşma ihtimali bulunan kod satırları try bloğunun içine yazılır. Try bloğu içerisinde herhangi bir hata meydana gelirse try bloğundaki diğer kodlar çalıştırılmadan catch bloğu içerisine atlanarak buradaki kodlar çalıştırılır. Eğer programda hata meydana gelmezse catch bloğu içerisinde ki kodlar çalıştırılmaz. Try ve catch komutları mutlaka birlikte kullanılması gereken bloklardır. Finally bloğunun kullanımı ise yazılımcının isteğine bağlıdır. Finally bloğunda ki kodlar try ve catch bloklarından bağımsız her halükarda çalıştırılacak kodları içerir.

Konunun daha iyi anlaşılması için bir örnek üzerinden devam edelim. Bir form uygulaması açarak, ortalamayı hesaplayan aşağıdaki gibi bir uygulama yapalım.


ortalama-hesaplama-formu.jpg


Hesapla butonuna tıklayarak aşağıdaki kodları yazıyoruz.

Kod:
     [COLOR="DeepSkyBlue"]   try[/COLOR]
            {
                double sayi1 = Convert.ToDouble(txtSayi1.Text);
                double sayi2 = Convert.ToDouble(txtSayi2.Text);
                double ort = (sayi1 + sayi2) / 2;
                lblSonuc.Text = ort.ToString();
            }
           [COLOR="deepskyblue"] catch (Exception hataTuru)[/COLOR]
            {
                lblSonuc.Text = "Hata meydana geldi." + hataTuru;
            }
           [COLOR="deepskyblue"] finally[/COLOR]
            {
                txtSayi1.Text = "";
                txtSayi2.Text = "";
            }

Kodları incelediğimizde kullanıcıdan verilerin alınarak değişkenlere atıldığı kısım try bloğu içerisine yazılmıştır. Bu blok içerisinde ki kodlarda kullanıcının textbox’lara sayısal değerler dışında veri girildiğinde hata oluşacağı öngörülmüştür. Eğer kullanıcı yanlış veri girişi yaparsa catch bloğundaki kodlar çalıştırılır ve “hata meydana geldi” mesajı verilir. Hata oluşsa da oluşmasa da finally bloğu içerisindeki kod çalıştırılarak textboxdaki veriler silinir.

hataTuru olarak tanımlanan değişken Exception turundedir ve yakalanan hatayla ilgili verileri içerir.


Birden Fazla Catch Bloğu Oluşturmak


Uygulamalarda bir çok sebepten dolayı hata oluşma riski bulunmaktadır. Şayet farklı hata türleri oluştuğunda farklı kod blokları işletilmek istenirse birden fazla catch bloğu kullanılabilir.


Kod:
try{
[COLOR="lime"]//hataya müsait kod bloğu[/COLOR]
}
catch(OverFlowException hata1){
[COLOR="Lime"]//Taşma hatası meydana gelirse çalıştırılacak kod bloğu[/COLOR]
}
catch(ArithmeticException hata2){
[COLOR="lime"]//Aritmetiksel hata meydana gelirse çalıştırılacak kod bloğu[/COLOR]
}

Not: Finally kod bloğunun kullanılması tamamen programcının isteğine ve ihtiyacına bağlıdır. Kullanılması zorunlu değildir.


Alıntıdır!​
 

zztri

Yaşayan Forum Efsanesi
9 Tem 2015
10,053
4
390
Ankara
Üstad ellerine sağlık ama iki şey eklemelisin. İlk olarak ihtiyacımız olmayan şeyi catch bloklarında yazmak zorunda değiliz. Mesela exception değişkenini asla kullanmayacak mıyız?

Kod:
try {
....
} catch (NullPointerException) {
....
}
diyebiliriz.

Veya hangi exception olduğunu bile bilmemize gerek yoktur bazı durumlarda..

Kod:
try {
....
} catch {
....
}

İkinci olarak da, try/catch yavaştır. Sırf stacktrace'in hazırlanması bile kaynak harcar. Elimizden geldiğince hatayı elle bulmak/engellemek, sonra ancak bunun mümkün olmadığı durumlarda try/catch'e güvenmek en iyisidir.
 

Noises

Üye
22 Ağu 2017
165
0
26
Balıkesir
Üstad ellerine sağlık ama iki şey eklemelisin. İlk olarak ihtiyacımız olmayan şeyi catch bloklarında yazmak zorunda değiliz. Mesela exception değişkenini asla kullanmayacak mıyız?

Kod:
try {
....
} catch (NullPointerException) {
....
}
diyebiliriz.

Veya hangi exception olduğunu bile bilmemize gerek yoktur bazı durumlarda..

Kod:
try {
....
} catch {
....
}

İkinci olarak da, try/catch yavaştır. Sırf stacktrace'in hazırlanması bile kaynak harcar. Elimizden geldiğince hatayı elle bulmak/engellemek, sonra ancak bunun mümkün olmadığı durumlarda try/catch'e güvenmek en iyisidir.

Aynen dostum, konu alıntı zaten ayrıca c# 'da yeni olduğum için ellemek istemedim yazıya :)
önerin için teşekkürler
 
Üst

Turkhackteam.org internet sitesi 5651 sayılı kanun’un 2. maddesinin 1. fıkrasının m) bendi ile aynı kanunun 5. maddesi kapsamında "Yer Sağlayıcı" konumundadır. İçerikler ön onay olmaksızın tamamen kullanıcılar tarafından oluşturulmaktadır. Turkhackteam.org; Yer sağlayıcı olarak, kullanıcılar tarafından oluşturulan içeriği ya da hukuka aykırı paylaşımı kontrol etmekle ya da araştırmakla yükümlü değildir. Türkhackteam saldırı timleri Türk sitelerine hiçbir zararlı faaliyette bulunmaz. Türkhackteam üyelerinin yaptığı bireysel hack faaliyetlerinden Türkhackteam sorumlu değildir. Sitelerinize Türkhackteam ismi kullanılarak hack faaliyetinde bulunulursa, site-sunucu erişim loglarından bu faaliyeti gerçekleştiren ip adresini tespit edip diğer kanıtlarla birlikte savcılığa suç duyurusunda bulununuz.