C# Windows Form’da Hata Yakalama

C# dilinde, hataları yönetmek ve uygulamanın çökmesini önlemek için try-catch-finally yapısı kullanılır. Bu yapı, hata yakalama mekanizması sunar ve kodunuzda beklenmeyen durumlara karşı önlem almanızı sağlar.

Bu yazıda, Windows Form uygulamaları ile hata yakalama işlemlerini örneklerle ele alacağız.


1. Try-Catch Yapısının Temelleri

Try-catch yapısı, bir kod bloğunu izler ve bir hata oluştuğunda bu hatayı yakalayarak işlemin devam etmesini sağlar.

Yapı:

try
{
    // Hata oluşabilecek kod
}
catch (Exception ex)
{
    // Hata yakalandığında yapılacak işlemler
}
finally
{
    // İsteğe bağlı: Her durumda çalışacak kodlar
}

  • try: Hata oluşabilecek kodun yazıldığı blok.
  • catch: Hata oluştuğunda çalışan blok. Hata bilgisi, Exception nesnesiyle alınır.
  • finally: Hata oluşsa da oluşmasa da çalışan blok (isteğe bağlıdır).

2. Hata Yakalama Örneği

Senaryo: Kullanıcı bir TextBox’a sayı girdiğinde, bu sayıyı 10’a bölen bir işlem yapılır. Ancak kullanıcı geçersiz bir giriş yaparsa hata mesajı gösterilir.

Arayüz Tasarımı:

  • TextBox: (txtSayi)
  • Button: (btnHesapla)
  • Label: (lblSonuc)

Kod:

private void btnHesapla_Click(object sender, EventArgs e)
{
    try
    {
        int sayi = Convert.ToInt32(txtSayi.Text); // Kullanıcıdan gelen değeri sayıya çevir
        int sonuc = 10 / sayi; // Sayıyı 10'a böl
        lblSonuc.Text = "Sonuç: " + sonuc;
    }
    catch (DivideByZeroException)
    {
        MessageBox.Show("Sıfıra bölme hatası! Lütfen sıfırdan farklı bir değer giriniz.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (FormatException)
    {
        MessageBox.Show("Geçersiz bir giriş yaptınız. Lütfen bir sayı giriniz.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Bilinmeyen bir hata oluştu: " + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        txtSayi.Clear(); // TextBox'ı temizle
    }
}

Açıklama:

  • Kullanıcı bir sayı girdiğinde, bu sayı 10’a bölünür.
  • DivideByZeroException: Kullanıcı sıfır girerse bu hata yakalanır.
  • FormatException: Kullanıcı geçersiz bir giriş (örneğin metin) yaparsa bu hata yakalanır.
  • Exception: Diğer tüm bilinmeyen hatalar için genel bir yakalama sağlar.
  • finally bloğu: Her durumda TextBox temizlenir.

3. Hata Türlerini Ayırma

Birden fazla catch bloğu kullanarak farklı hataları ayrı ayrı yönetebilirsiniz.

Senaryo: Kullanıcı iki TextBox’a sayı girer. Birinci sayı bölünen, ikinci sayı bölen olarak kullanılır.

Arayüz Tasarımı:

  • TextBox: (txtBolunen, txtBolen)
  • Button: (btnBol)
  • Label: (lblSonuc)

Kod:

private void btnBol_Click(object sender, EventArgs e)
{
    try
    {
        int bolunen = Convert.ToInt32(txtBolunen.Text);
        int bolen = Convert.ToInt32(txtBolen.Text);
        int sonuc = bolunen / bolen;
        lblSonuc.Text = "Sonuç: " + sonuc;
    }
    catch (DivideByZeroException)
    {
        MessageBox.Show("Bölen sıfır olamaz! Lütfen sıfırdan farklı bir değer giriniz.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    catch (FormatException)
    {
        MessageBox.Show("Lütfen her iki kutucuğa da geçerli bir sayı giriniz.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Warning);
    }
    catch (Exception ex)
    {
        MessageBox.Show("Bir hata oluştu: " + ex.Message, "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
    finally
    {
        txtBolunen.Clear();
        txtBolen.Clear();
    }
}


4. Kullanıcıya Özel Hata Mesajları

Hatalar kullanıcı dostu mesajlarla aktarılmalıdır. Mesaj kutularını özelleştirerek kullanıcı deneyimini artırabilirsiniz.

Örnek:

MessageBox.Show("Beklenmeyen bir hata oluştu. Lütfen daha sonra tekrar deneyiniz.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Information);


5. Hata Günlüğü (Logging)

Uygulamada oluşan hataları bir dosyaya kaydetmek isteyebilirsiniz. Bu, hata çözümünde size yardımcı olur.

Örnek Kod:

private void LogHata(Exception ex)
{
    string logDosyasi = "hata_log.txt";
    File.AppendAllText(logDosyasi, DateTime.Now + ": " + ex.Message + Environment.NewLine);
}

Bu fonksiyonu bir catch bloğunda çağırabilirsiniz:

catch (Exception ex)
{
    LogHata(ex);
    MessageBox.Show("Bir hata oluştu ve kaydedildi.", "Hata", MessageBoxButtons.OK, MessageBoxIcon.Error);
}

One comment

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir