Satu blok try bisa mengalami kegagalan yang berbeda sifatnya: input mungkin bukan angka, atau berupa angka tetapi melebihi rentang int. int.Parse melaporkan kedua situasi itu dengan exception berbeda — FormatException untuk format salah dan OverflowException untuk angka yang terlalu besar. Multiple catch memungkinkan kita memberi reaksi berbeda untuk tiap jenis kegagalan.

Dua Catch untuk Dua Kegagalan #

Blok catch dituliskan berurutan setelah satu blok try. Saat exception terlempar, runtime memeriksa blok catch dari atas ke bawah dan memilih blok pertama dengan tipe yang cocok; blok berikutnya tidak diperiksa lagi.

csharp
string[] inputPengguna = { "150000", "seratus ribu", "999999999999" };

foreach (string input in inputPengguna)
{
    try
    {
        int angka = int.Parse(input);
        Console.WriteLine($"Angka valid: {angka}");
    }
    catch (FormatException)
    {
        Console.WriteLine("Format tidak valid: input bukan angka");
    }
    catch (OverflowException)
    {
        Console.WriteLine("Angka melebihi rentang int");
    }
}

Output yang Dihasilkan:

text
Angka valid: 150000
Format tidak valid: input bukan angka
Angka melebihi rentang int

Mari kita telaah hasilnya:

  1. Baris 1: Tiga input diuji: satu normal, satu bukan angka, satu angka raksasa yang melampaui rentang int (sekitar ±2,1 miliar — lihat bab Batas dan Overflow).
  2. Iterasi 1: "150000" berhasil dikonversi; kedua blok catch dilewati.
  3. Iterasi 2: "seratus ribu" melempar FormatException; runtime memilih blok catch pertama karena tipenya cocok.
  4. Iterasi 3: "999999999999" melempar OverflowException; blok catch pertama tidak cocok, sehingga runtime melanjutkan ke blok kedua yang mencetak pesan berbeda.

Aturan Urutan Blok Catch #

Urutan blok catch menurut dari yang paling spesifik ke yang paling umum. Semua exception mewarisi System.Exception, sehingga blok catch (Exception) menangkap apa saja dan harus selalu berada paling bawah. Compiler menegakkan aturan ini: bila blok umum ditulis sebelum blok spesifik yang tidak pernah terjangkau, kompilasi gagal dengan kesalahan CS0160.

csharp
try
{
    int angka = int.Parse("seratus ribu");
}
catch (Exception ex)
{
    Console.WriteLine($"Jaring penangkap terakhir: {ex.Message}");
}

Bentuk catch (Exception) berguna sebagai pengaman terakhir, tetapi sebaiknya ditempatkan setelah semua tipe spesifik yang benar-benar kita reaksi.