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 #
// Program tanpa penanganan exception
int harga = int.Parse("empat puluh ribu");
Console.WriteLine($"Harga terbaca: {harga}");Output yang Dihasilkan:
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 2Jalur file pada pesan mengikuti lokasi project di komputer tempat program dijalankan; pada contoh di atas jalurnya dipangkas agar ringkas. Mari kita uraikan pesan tersebut:
- Baris 2 (
int.Parse("empat puluh ribu")): Method mendeteksi isi string tidak berformat angka, lalu melempar (throw) objekFormatException— istilah “melempar” berarti runtime membuat objek exception dan menghentikan eksekusi baris tersebut. - Baris
at System.Int32.Parsedan berikutnya: Runtime mencari penanganan (handler) di method pemanggil, method di atasnya, dan seterusnya sepanjang call stack. Tidak ada penanganan yang ditemukan. 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.
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:
Tipe exception: FormatException
Pesan: The input string 'empat puluh ribu' was not in a correct format.
Program melanjutkan eksekusi setelah blok try-catchMari kita telaah baris demi baris:
- Baris 1-6 (blok
try): Statement berpotensi gagal dibungkus di sini; eksekusi berjalan normal sampaiint.Parsemelempar exception. - Baris 7 (
catch (FormatException ex)): Runtime mencocokkan tipe exception dengan tipe di catch; cocok, sehingga objek exception terikat ke variabelexdan blok catch dieksekusi. - Baris 9-10: Properti
Messagemembaca pesan asli dari exception; barisHarga terbaca: ...dilewati karena eksekusi sudah berpindah. - Baris 12: Program berlanjut ke statement setelah try-catch — inilah keunggulan utama penanganan: program tidak berhenti.