🚀 C# ile Programlamaya Giriş: Kodlamaya İlk Adımını At, Kendi Projelerini Geliştirmeye Başla!
00ANASAYFA 01YAZILAR 02EĞİTİM 03ELEKTRİK_ENERJİ 04OTOMOTİV_MÜHENDİSLİĞİ 05ARAÇLAR 06LAB 07SÖZLÜK 08ETİKETLER ♡OKUMA LİSTEM ⌕ARA
TRENG

Hata Yönetimi: try, catch, finally

Programının hata anında çökmesini engelle: istisna kavramı, try/catch/finally, throw, kendi hata sınıfın ve using ile kaynak temizliği.

İstisna (exception) nedir?

Program çalışırken beklenmedik bir durum olur: sıfıra bölme, olmayan dosyayı açma, listede olmayan indekse erişme... .NET bu durumlarda bir istisna (exception) nesnesi fırlatır. Yakalanmazsa program mesaj yazıp kapanır. Amacımız bu durumlara hazırlıklı olmak ve kullanıcıya düzgün cevap vermektir.

try - catch

try
{
    Console.Write("Sayı gir: ");
    int sayi = int.Parse(Console.ReadLine()!);
    Console.WriteLine($"100 / {sayi} = {100 / sayi}");
}
catch (FormatException)
{
    Console.WriteLine("Bu bir sayı değil.");
}
catch (DivideByZeroException)
{
    Console.WriteLine("Sıfıra bölemezsin.");
}

Riskli kodu try bloğuna koyarsın. İçinde bir istisna oluşursa akış hemen eşleşen catch bloğuna atlar. Birden çok catch yazarak farklı hataları ayrı ayrı karşılayabilirsin; özel olandan genele doğru sırala.

Sayı gir: abc
Bu bir sayı değil.

Hata nesnesine erişmek

try
{
    int[] dizi = { 1, 2, 3 };
    Console.WriteLine(dizi[5]);
}
catch (Exception ex)
{
    Console.WriteLine($"Hata türü: {ex.GetType().Name}");
    Console.WriteLine($"Mesaj: {ex.Message}");
}
Hata türü: IndexOutOfRangeException
Mesaj: Index was outside the bounds of the array.

Hata mesajları .NET'in dil ayarına göre İngilizce ya da Türkçe gelebilir. Exception tüm hataların atasıdır; en sona koyduğun genel bir yakalayıcı olarak iş görür.

finally: her durumda çalışan blok

Dosya kapatma, bağlantıyı bırakma gibi temizlik işleri hata olsa da olmasa da yapılmalıdır. finally bloğu bunun içindir:

StreamReader? okuyucu = null;
try
{
    okuyucu = new StreamReader("olcumler.txt");
    Console.WriteLine(okuyucu.ReadLine());
}
catch (FileNotFoundException)
{
    Console.WriteLine("olcumler.txt bulunamadı.");
}
finally
{
    okuyucu?.Dispose();    // açıksa kapat
    Console.WriteLine("Temizlik yapıldı.");
}

?. operatörü "nesne null değilse çağır" demektir.

using: kısa yoldan temizlik

Dosya gibi kapatılması gereken nesneler için using bildirimi, blok bitince nesneyi otomatik kapatır; finally yazmaktan seni kurtarır:

try
{
    using var okuyucu = new StreamReader("olcumler.txt");
    string? satir;
    while ((satir = okuyucu.ReadLine()) != null)
    {
        Console.WriteLine(satir);
    }
}
catch (FileNotFoundException)
{
    Console.WriteLine("Dosya yok.");
}

throw: hatayı sen fırlat

Bir metot geçersiz girdi alırsa sessizce yanlış sonuç vermek yerine hata fırlatmalıdır:

static double Akim(double gerilim, double direnc)
{
    if (direnc <= 0)
        throw new ArgumentOutOfRangeException(nameof(direnc), "Direnç sıfırdan büyük olmalı.");
    return gerilim / direnc;
}

try
{
    Console.WriteLine(Akim(5, 0));
}
catch (ArgumentOutOfRangeException ex)
{
    Console.WriteLine("Geçersiz: " + ex.ParamName);
}
Geçersiz: direnc

Kendi hata sınıfını yazmak

Alanına özgü bir hata için Exception'dan türetebilirsin:

try
{
    double akim = 12.5;
    if (akim > 10) throw new AsiriAkimException(akim);
}
catch (AsiriAkimException ex)
{
    Console.WriteLine(ex.Message);
}

class AsiriAkimException : Exception
{
    public double Akim { get; }

    public AsiriAkimException(double akim)
        : base($"Akım sınırı aşıldı: {akim} A")
    {
        Akim = akim;
    }
}
Akım sınırı aşıldı: 12,5 A

Anti-desen: catch (Exception) { } yazıp hatayı yutma. Sorun gizlenir ve sonra bulması çok zorlaşır. Yakalıyorsan ya düzelt, ya kaydet, ya da yeniden fırlat (throw;).

İpucu: Beklenen durumlar için (kullanıcı hatalı sayı yazdı) istisna yerine TryParse gibi kontrollü yöntemleri tercih et. İstisna "olmaması gereken" durumlar içindir; ayrıca nispeten yavaştır.

Kendin dene

Kullanıcıdan bir dosya adı iste ve dosyanın satır sayısını yazan program yaz. Dosya yoksa, okuma izni yoksa (UnauthorizedAccessException) ve başka bir hata varsa üç ayrı mesaj ver. Dosya using ile açılsın.

// Mini sınav

Bir seçeneğe tıkla; doğru mu yanlış mı, anında ve nedeniyle birlikte göreceksin.

1. finally bloğu ne zaman çalışır?
2. Birden fazla catch bloğu yazarken sıralama nasıl olmalıdır?
3. using var okuyucu = new StreamReader(...) kullanımının faydası nedir?

Bitirdiğinde işaretle: ilerlemen kaydolur, +20 XP kazanırsın.

İpucu: ← → tuşlarıyla dersler arasında gezinebilirsin.