Exception filtreleme
when koşulu ile catch filtreleme öğrenirsin.
Exception filtreleme (when)
C# 6'dan beri catch bloklarına when koşulu ekleyebilirsin: catch (Exception ex) when (ex.Message == "..."). Bu, exception filtrelemesi (exception filter) olarak bilinir. Koşul true ise catch çalışır; değilse catch atlanır.
Filtreleme, hata türüne ek olarak hatanın içeriğine göre davranışı belirlemeni sağlar. Örneğin yalnızca belirli mesajlardaki hataları yakalayıp diğerlerini yukarı bırakabilirsin. Filtre içinde Log(ex) gibi yan etkileri de kullanabilirsin.
Filtre örnekleri
Birden çok catch bloğunu when ile ayırt edebilirsin. Örnek: catch (Exception ex) when (ex.Message.Contains("disk")) { ... } ve ayrıca catch (Exception ex) when (ex.Message.Contains("ağ")) { ... }. Bu, hata mesajına göre farklı işlemler yapmanı sağlar.
Filtre içinde false döndüğünde catch atlanır ve başka bir catch aranır; yoksa exception yukarı yayılır. Filtreleri kullanırken yan etkili kodlardan kaçın; çünkü hata ayıklama zorlaşır.
Uygulama when ile filtrele
static async Task FailAsync(string msg) metodunu tanımla. Gövdede await Task.CompletedTask; ve throw new Exception(msg); yaz. Main'i static async Task Main yap. try { await FailAsync("Beklenen"); } catch (Exception ex) when (ex.Message == "Beklenen") { Console.WriteLine("Yakalandı"); } ile filtreyi uygula ve yazdır.
Örnek çözümü göster
FailAsync gövdesinde await Task.CompletedTask; ve throw new Exception(msg); yaz. Main'i static async Task Main() yapıp try { await FailAsync("Beklenen"); } catch (Exception ex) when (ex.Message == "Beklenen") { Console.WriteLine("Yakalandı"); }
Örnek çözüm:
using System;
using System.Threading.Tasks;
class Program
{
static async Task FailAsync(string msg)
{
await Task.CompletedTask;
throw new Exception(msg);
}
static async Task Main()
{
try
{
await FailAsync("Beklenen");
}
catch (Exception ex) when (ex.Message == "Beklenen")
{
Console.WriteLine("Yakalandı");
}
}
}
Kendini test et
-
when koşulunu tamamla
catch (Exception ex) ____ (ex.Message == "Hata") { Console.WriteLine(ex.Message); }Cevabı göster
catch (Exception ex) when (ex.Message == "Hata") { Console.WriteLine(ex.Message); } -
when koşulu ne yapar?
- finally bloğu ekler
- try bloğunu yineler
- Exception'ı otomatik yutar
- catch'i yalnızca koşul true ise çalıştırır
Cevabı göster
catch'i yalnızca koşul true ise çalıştırır — Doğru. when koşulu true ise catch çalışır; değilse atlanır.
-
Filtreleme kavramlarını eşleştir
- when (koşul)
- Catch'i filtreler
- ex.Message.Contains(...)
- Mesaja göre koşul
- catch (Exception ex)
- Genel catch
- false dönerse
- Catch atlanır