Try Blokları

Try blokları, içinde çalıştırılması planlanan kod parçalarını kapsar. Bu blokta herhangi bir istisna (exception) oluştuğunda, program akışı catch bloğuna geçer. Bu nedenle, hata alması muhtemel kodlar, try blokları içerisine yerleştirilir. Try blokları, program akışının düzgün çalışabilmesi için kritik öneme sahiptir. Aşağıda bir örnek verilmiştir:

int a = 5;
int b = 0;
int sonuc;

try
{
    sonuc = a / b; // Burada bir hata meydana gelecektir.
}

Catch Blokları

Catch blokları, try bloğu içinde meydana gelen istisnaları yakalamak için kullanılır. Bu blok, hata türüne göre farklı yakalama işlemleri gerçekleştirebilir. Eğer bir istisna oluşursa, ilgili catch bloğu devreye girer ve hata yönetimi sağlanır. Aşağıda catch kullanımına dair bir örnek:

int a = 5;
int b = 0;
int sonuc;

try
{
    sonuc = a / b; // Burada bir hata meydana gelecektir.
}
catch (DivideByZeroException ex) // Sıfıra bölme hatasını yakalıyoruz.
{
    Console.WriteLine("Hata: Sıfıra bölme işlemi yapılamaz. " + ex.Message);
}

Finally Blokları

Finally blokları, try-catch yapısının hemen ardından yer alır ve her koşulda çalıştırılacak olan kodları içerir. Yani, hata olsun ya da olmasın, finally bloğundaki kodlar mutlaka çalışır. Bu yapı, kaynakları serbest bırakma veya temizlik işlemleri için idealdir. Örnek:

int a = 5;
int b = 0;
int sonuc;

try
{
    sonuc = a / b; // Burada bir hata meydana gelecektir.
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("Hata: Sıfıra bölme işlemi yapılamaz. " + ex.Message);
}
finally
{
    Console.WriteLine("Temizlik işlemleri yapılıyor."); // Her durumda çalışacak kod.
}

Hata Yönetiminin Önemi

Hata yönetimi, uygulama geliştirmenin vazgeçilmez bir parçasıdır. Programların kullanıcılar tarafından daha iyi deneyimler sunabilmesi için, hataların kontrol altına alınması gerekir. Hata yönetimi, beklenmedik durumlarla başa çıkabilmek ve kullanıcıya bilgi sunmak için kullanılır. Aşağıda hata yönetiminin önemini vurgulayan bir örnek bulunmaktadır:

try
{
    // Programın kritik bir kısmı
    int[] sayilar = { 1, 2, 3 };
    Console.WriteLine(sayilar[5]); // Bu satırda bir hata meydana gelecektir.
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("Hata: Dizinin dışına çıkma hatası. " + ex.Message);
}
finally
{
    Console.WriteLine("Kritik bölüm tamamlandı."); // Temizlik işlemleri.
}

Birden Fazla Catch Bloğu

C#’ta bir try bloğu içinde birden fazla catch bloğu bulunabilir. Bu, farklı hata türlerini ayrı ayrı yakalayabilmeyi sağlar. Hangi hatanın meydana geldiğine bağlı olarak doğru catch bloğu çalıştırılır. Aşağıdaki örnekte, birden fazla catch bloğunun nasıl kullanılacağını görebilirsiniz:

try
{
    int sayi = int.Parse("geçersiz"); // Format hatası meydana gelebilir.
}
catch (FormatException ex)
{
    Console.WriteLine("Hata: Geçersiz format. " + ex.Message);
}
catch (OverflowException ex)
{
    Console.WriteLine("Hata: Sayı çok büyük veya çok küçük. " + ex.Message);
}
finally
{
    Console.WriteLine("Giriş işlemi tamamlandı."); // Temizlik işlemleri.
}

Uygulamalı Örnek

Aşağıdaki örnekte, kullanıcıdan alınan bir sayı ile 10 sayısını bölen bir program tasarlıyoruz. Burada try, catch ve finally bloklarının nasıl çalıştığını gözlemleyeceğiz.

int sayi;
int sonuc;

try
{
    // Kullanıcıdan sayıyı almak yerine sabit bir değer belirliyoruz.
    sayi = Convert.ToInt32("0"); // Hata olması için sıfır giriyoruz.
    
    sonuc = 10 / sayi; // Burada bir hata meydana gelebilir.
    Console.WriteLine("Sonuç: " + sonuc);
}
catch (FormatException ex) // Sayı format hatası
{
    Console.WriteLine("Hata: Geçersiz sayı formatı. " + ex.Message);
}
catch (DivideByZeroException ex) // Sıfıra bölme hatası
{
    Console.WriteLine("Hata: Sıfıra bölme işlemi yapılamaz. " + ex.Message);
}
finally
{
    Console.WriteLine("Program sonlandırılıyor."); // Temizlik işlemleri.
}