Multiple catch memisahkan penanganan berdasarkan tipe exception. Akan tetapi, kadang satu tipe saja tidak cukup: program perlu membedakan FormatException yang satu dari yang lain berdasarkan isi pesannya. Exception filter menambahkan syarat berupa ekspresi bool pada blok catch melalui kata kunci when, dan blok tersebut hanya dieksekusi bila syaratnya true.
Sintaks when pada Catch #
string[] inputPengguna = { "abc", "def" };
foreach (string input in inputPengguna)
{
try
{
int angka = int.Parse(input);
Console.WriteLine($"Angka valid: {angka}");
}
catch (FormatException ex) when (ex.Message.Contains("abc"))
{
Console.WriteLine($"Filter 'abc' cocok untuk input '{input}'");
}
catch (FormatException)
{
Console.WriteLine($"Filter tidak cocok, ditangkap catch umum: '{input}'");
}
}Output yang Dihasilkan:
Filter 'abc' cocok untuk input 'abc'
Filter tidak cocok, ditangkap catch umum: 'def'Mari kita telaah baris demi baris:
- Baris 1: Dua input diuji; keduanya bukan angka sehingga keduanya memicu
FormatException. - Baris 10 (
catch (FormatException ex) when (ex.Message.Contains("abc"))): Untuk input"abc", pesan exception memuat teks'abc'sehingga ekspresiwhenbernilaitruedan blok pertama dieksekusi. - Baris 14-17 (catch umum): Untuk input
"def", filter bernilaifalse. Runtime tidak menganggap exception tertangkap di blok pertama, melainkan meneruskan pencarian ke blok berikutnya — yang mencetak pesan berbeda. - Perilaku penting: Filter yang
falsetidak membatalkan exception; runtime melanjutkan ke catch berikutnya atau ke lapisan pemanggil bila tidak ada yang cocok.
Mengapa when Lebih Baik daripada if di Dalam Catch #
Cara alternatif adalah menangkap semua FormatException lalu memilah dengan if di dalam blok catch. Filter when lebih baik untuk dua alasan. Pertama, niat kode terbaca langsung di header catch: kondisi penangkapan tertulis eksplisit. Kedua, bila filter bernilai false, runtime berperilaku seolah blok itu tidak pernah ada — jejak call stack exception tetap asli, dan debugger tidak berhenti di blok yang pada akhirnya tidak menangani exception.
Filter dapat memakai ekspresi apa pun yang menghasilkan bool, misalnya when (ex.HResult == 2146233033) atau syarat terhadap variabel di luar catch. Sebutkan kondisi yang benar-benar bermakna bagi program, bukan sekadar membedakan teks pesan.