Giriş: C# Windows Forms Uygulamasında Hata Yönetimi
[[academy-video-youtube({"vid": "uFz51uX8RLY", "start_time": "0", "title": "C# App Başlangıçtan Bitişe Ders 25 - Hata Yönetimi", "creator": "Tim Corey", "length": "23m 09s"})]]
"C# App Başlangıçtan Bitişe" serisinin 25. dersinde, Tim Corey, sıkça yanlış anlaşılan ama kritik bir konuya odaklanıyor: C# Windows Forms uygulamasında hata yönetimi. Tim, hata yönetiminin her yere try-catch blokları atmakla ilgili olmadığını, ancak uygulamanızın geçersiz girdilere, beklenmedik durumlara ve kullanıcı hatalarına nasıl yanıt verdiğini isteyerek tasarlamakla ilgili olduğunu açıklar.
Bu derste, Tim, serinin daha önceki bölümlerinde oluşturulmuş Turnuva Görüntüleyici formunu kullanarak gerçek örneklerle adım adım ilerler. Hataların nasıl meydana geldiğini ve nasıl ele alınması gerektiğini izleyerek, bir uygulamanın ne zaman başarısız olmasına izin vereceğimizi, ne zaman yürütmeyi durduracağımızı ve ne zaman anlamlı bir geri bildirimle kullanıcıyı yönlendireceğimizi daha derin, pratik bir şekilde anlarız. Tim'in açıklamasına adım adım, doğrudan videodan detaylı bir göz atalım.
Sorunu Anlama: Hata Yönetilmeyen İstisnalar
Dersin başında Tim, hedefi tanıtır: mevcut Turnuva Görüntüleyici formuna temel hata ayıklama eklemek. Hemen gerçek bir sorunu gösteriyor — her iki takıma da aynı puan verildiğinde ve "Puan" düğmesine tıklandığında, uygulama bir istisna fırlatıyor.
Tim, bu davranışın Visual Studio'da görülebildiğini ancak son kullanıcılar için durumun daha kötü olduğunu açıklar. Uygulama .exe olarak çalışıyorsa, hata mesajı görünecek ve ardından mesaj kutusu kapatıldığında uygulama çökecektir. Tim, bunun kullanıcıya yönelik bir uygulama için kabul edilemez bir davranış olduğunu vurgular.
Genel Try-Catch Bloklarının Kötü Bir Fikir Olmasının Sebebi
Tim, geliştiricilerin yaygın yaptığı bir hatayı tartışır: tüm yöntemleri bir try-catch bloğuna sarmak ve bunu 'hata işleme' olarak adlandırmak. Bu yaklaşımı şiddetle eleştirir ve bunu gerçek işleme yerine 'hata yemeye' daha yakın olarak niteler.
Yaklaşık bu noktada, Tim önemli bir felsefeyi açıklar: Eğer bir uygulama beklenmedik bir şekilde başarısız oluyorsa, muhteşem bir şekilde başarısız olmalıdır. Hataları sessizce gizlemek hata ayıklamayı zorlaştırır ve bozuk durumun yayılmasına izin verir. Hataların yakalanması gereken tek zaman, beklenen ve kullanıcı tarafından kaynaklanan durumlar olmalıdır.
UI Katmanında Hedeflenmiş Try-Catch
Her şeyi sarmak yerine, Tim potansiyel olarak başarısız olabilecek kod satırı etrafında nasıl bir try-catch bloğu uygulanacağını gösterir. Puanlama mantığını bir try bloğuyla çevreleyip, bir istisnayı adını belirterek yakalayarak gösterir.
Tim burada iki en iyi uygulamayı vurgular:
İstisna değişkeninize her zaman ad verin ki ayrıntılarına erişebilesiniz.
- throw ex; kullanarak yeniden fırlatmayın çünkü bu önemli yığın izleme bilgisini yok eder. Bunun yerine, gerektiğinde yeniden fırlatmak için throw; kullanın.
Bu durumda, hata UI'da meydana geldiği için, Tim bunu doğrudan bir Hata Mesaj Kutusu göstererek orada halletmeyi seçer.
Kullanıcı Geri Bildirimini Mesaj Kutusu ile İyileştirme
Tim, kullanıcıya net bir hata mesajı gösteren bir MessageBox.Show çağrısı ekler. Bağlı puan tekrar girildiğinde, uygulama şimdi şu şekilde bir uyarı gösterir:
"Uygulama aşağıdaki hatayı aldı: Bu uygulamada beraberliklere izin vermiyoruz."
Tim, bunun zaten büyük bir iyileştirme olduğunu belirtir. Hata işlenir, veritabanı güncellenmez ve uygulama güvenli bir şekilde çalışmaya devam eder.
Kullanıcıya Asla Güvenme: Giriş Doğrulama
Tim'in temel ilkelerinden biri burada açıkça tekrarlanır: Kullanıcıya asla güvenme.
Bu aşamada, uygulama kullanıcıların geçerli sayısal puanlar gireceğini varsayar. Tim bunun neden tehlikeli olduğunu açıklar ve kullanıcı girdilerini işlemeye başlamadan önce doğrulamanın gerekliliğini tanıtır.
GeçerliVeri adında bir özel yöntem oluşturur ve şunları kontrol eder:
Her iki skor girişinin de geçerli birer sayı olup olmadığı
Her iki skorun da sıfır olup olmadığı
- Puanların eşit olup olmadığı
Başlangıçta, bu yöntem bir bool döndürerek çağrılan kodun yürütmeye devam etmesini durdurur ve genel bir hata mesajı gösterir.
Boolean Doğrulamadan Açıklayıcı Hatalara
Tim, genel "Geçerli veri girmeniz gerekiyor" mesajıyla tatmin olmaz. İyi bir hata işleme, kullanıcıya tam olarak neyin yanlış gittiğini söylemelidir.
Bunu iyileştirmek için, doğrulama yöntemini bir boolean yerine bir string döndürecek şekilde değiştirdi. Boş bir dize hata olmadığı anlamına gelir; aksi takdirde, dize aşağıdaki gibi spesifik bir mesaj içerir:
"Skor 1 değeri geçerli bir sayı değil"
"Hiçbir takım için puan girmediniz"
- "Bu uygulamada beraberliklere izin vermiyoruz"
Bu, UI'nin hedeflenen, anlamlı mesajlar göstermesini sağlar, belirsiz uyarılar yerine.
Mantık Hatalarını Else-If Zincirleriyle Düzeltme
Testlerden sonra, Tim mantıksal bir kusur fark eder: Geçersiz sayısal giriş bazen 'beraberliklere izin verilmez' mesajını tetikler. Bu durumun neden olduğunu açıklar—başarısız olan sayısal ayrıştırma değerleri sıfıra ayarlar ve ayrı if ifadeleri sonraki koşulların önceki mesajları geçersiz kılmasına izin verir.
Bunu düzeltmek için, Tim doğrulama kontrollerini bir else-if zincirine dönüştürür. Bu, bir hata koşulu karşılandığında diğerlerinin atlanmasını sağlar. Bu, mantığı daha açık, daha güvenli ve daha kolay bakımı yapılabilir hale getirir, Tim açıklar.
Hata Yönetimi Sadece Try-Catch Değildir
Tim bir adım geri atar ve önemli bir ders çıkarır: Hata yönetimi her zaman try-catch blokları kullanmak anlamına gelmez.
Manuel doğrulama—kullanıcı girişini işlemeye başlamadan kontrol etme—eşit derecede önemlidir. Erken doğrulama yaparak, uygulama kötü verilerin asla veritabanına veya iş mantığına ulaşmasını engeller.
Her şeyin doğrulama gerektirmediğini de açıklar. Açılır menüler ve liste kutuları gibi kapalı sistemler zaten girdiyi sınırlamaktadır. Ancak, serbest metin alanları her zaman doğrulanmalıdır.
Hata Yönetiminin Yaşayacağı Yer
Dersin sonunda, Tim yaygın bir soruya yanıt verir: Hata yönetimi nereye gitmeli?
Kuralı:
Doğrulama uygulama boyunca, backend dahil her yerde var olmalıdır.
- İstisnalar genellikle cephe uçta yakalanmalı, çünkü kullanıcıya burada bilgi verilebilir.
Tim backend istisna yönetiminin yalnızca sistemin kurtulabileceği durumlarda anlamlı olduğunu belirtir—örneğin SQL veritabanından bir metin dosyasına geçiş yaparken SQL kullanılabilir değilse.
Hata Yönetimi Üzerine Son Düşünceler
Tim, iyi bir hata işleme uygulamanın kararlılığını, kullanıcı deneyimini ve uzun vadeli bakımını artırdığını vurgulayarak sonuçlanır. Genel try-catch bloklarından kaçınmayı önerir ve geliştiricileri doğrulama ve istisna akışı hakkında bilinçli düşünmeye teşvik eder.
Bu ders, kullanıcıları yönlendiren, verileri koruyan ve gerektiğinde güvenli bir şekilde başarısız olan dayanıklı Windows Forms uygulamaları oluşturmanın temelini kurar.

