Seorang kasir memasukkan jumlah uang sebagai teks: "empat puluh ribu". Method int.Parse hanya bisa mengubah teks angka, sehingga konversi ini tidak mungkin berhasil. C# tidak membiarkan kegagalan semacam itu berjalan diam-diam; kegagalan dilaporkan melalui mekanisme yang disebut exception (pengecualian). Bab ini membahas apa yang sebenarnya terjadi, sebelum kita mempelajari cara menanganannya.

Apa yang Terjadi Tanpa Penanganan #

csharp
// Program tanpa penanganan exception
int harga = int.Parse("empat puluh ribu");
Console.WriteLine($"Harga terbaca: {harga}");

Output yang Dihasilkan:

text
Unhandled exception. System.FormatException: The input string 'empat puluh ribu' was not in a correct format.
   at System.Number.ThrowFormatException[TChar](ReadOnlySpan`1 value)
   at System.Int32.Parse(String s)
   at Program.<Main>$(String[] args) in Program.cs:line 2

Jalur file pada pesan mengikuti lokasi project di komputer tempat program dijalankan; pada contoh di atas jalurnya dipangkas agar ringkas. Mari kita uraikan pesan tersebut:

  1. Baris 2 (int.Parse("empat puluh ribu")): Method mendeteksi isi string tidak berformat angka, lalu melempar (throw) objek FormatException — istilah “melempar” berarti runtime membuat objek exception dan menghentikan eksekusi baris tersebut.
  2. Baris at System.Int32.Parse dan berikutnya: Runtime mencari penanganan (handler) di method pemanggil, method di atasnya, dan seterusnya sepanjang call stack. Tidak ada penanganan yang ditemukan.
  3. Unhandled exception: Karena tak satu pun penanganan ditemukan, runtime mencetak pesan ke terminal dan menghentikan program; baris 3 tidak pernah dieksekusi.

Objek exception membawa informasi penting: tipe kesalahan (FormatException), pesan penjelasan, dan jejak call stack. Tiga properti ini akan kita gunakan sepanjang section ini.

Menangkap Exception untuk Pertama Kali #

Blok try menandai kode yang berpotensi gagal, dan blok catch menampung kegagalan tersebut agar program bisa melanjutkan eksekusi.

csharp
try
{
    int harga = int.Parse("empat puluh ribu");
    Console.WriteLine($"Harga terbaca: {harga}");
}
catch (FormatException ex)
{
    Console.WriteLine($"Tipe exception: {ex.GetType().Name}");
    Console.WriteLine($"Pesan: {ex.Message}");
}

Console.WriteLine("Program melanjutkan eksekusi setelah blok try-catch");

Output yang Dihasilkan:

text
Tipe exception: FormatException
Pesan: The input string 'empat puluh ribu' was not in a correct format.
Program melanjutkan eksekusi setelah blok try-catch

Mari kita telaah baris demi baris:

  1. Baris 1-6 (blok try): Statement berpotensi gagal dibungkus di sini; eksekusi berjalan normal sampai int.Parse melempar exception.
  2. Baris 7 (catch (FormatException ex)): Runtime mencocokkan tipe exception dengan tipe di catch; cocok, sehingga objek exception terikat ke variabel ex dan blok catch dieksekusi.
  3. Baris 9-10: Properti Message membaca pesan asli dari exception; baris Harga terbaca: ... dilewati karena eksekusi sudah berpindah.
  4. Baris 12: Program berlanjut ke statement setelah try-catch — inilah keunggulan utama penanganan: program tidak berhenti.