Sejauh ini kita hanya menangkap exception yang dilempar method bawaan. Program yang kita tulis sendiri juga perlu melaporkan kegagalan: method menerima penyebut nol, atau data yang tidak memenuhi syarat. Statement throw melaporkan kegagalan tersebut secara eksplisit, dan bentuk throw; (tanpa operand) melempar ulang exception yang sedang ditangani tanpa menghapus jejaknya.
Untuk argumen yang tidak valid, .NET sudah menyediakan tipe ArgumentException; memilih tipe bawaan yang tepat membuat pesan galat lebih mudah dipahami pemanggil. Bila kegagalan bersifat khas domain aplikasi, tipe custom dibahas pada bab Membuat Custom Exception.
Melempar Exception Baru #
try
{
int hasil = BagiTotal(120000, 0);
Console.WriteLine($"Hasil bagi: {hasil}");
}
catch (ArgumentException ex)
{
Console.WriteLine($"Terjadi galat: {ex.Message}");
}
Console.WriteLine("Program melanjutkan eksekusi");
static int BagiTotal(int total, int jumlahOrang)
{
if (jumlahOrang == 0)
{
throw new ArgumentException("Jumlah orang tidak boleh nol");
}
return total / jumlahOrang;
}Output yang Dihasilkan:
Terjadi galat: Jumlah orang tidak boleh nol
Program melanjutkan eksekusiMari kita telaah baris demi baris:
- Baris 14-21 (method
BagiTotal): Method memeriksa syaratnya sendiri sebelum bekerja; pengecekan di awal seperti ini disebut guard clause. - Baris 17-18 (
throw new ArgumentException(...)): Kondisi penyebut nol membuat perhitungan tidak bermakna, sehingga method melempar exception dengan pesan yang menjelaskan penyebabnya — bukan mengembalikan angka keliru. - Baris 3 (
BagiTotal(120000, 0)): Pemanggilan dengan penyebut0menghentikan method di tengah jalan; barisreturntidak pernah dieksekusi. - Baris 6-9: Exception yang terlempar cocok dengan
ArgumentException, sehingga catch mencetak pesannya dan program melanjutkan ke statement setelahnya.
Melempar Ulang dengan throw; #
Kadang satu lapisan perlu mencatat kejadian lalu meneruskan exception ke lapisan atas — misalnya method lapisan data mencatat log, sedangkan lapisan UI menampilkan pesan. Bentuk throw; melempar ulang exception yang sama dengan informasi aslinya tetap utuh.
try
{
try
{
BagiTotal(100000, 0);
}
catch (ArgumentException)
{
Console.WriteLine("Catat log, lalu lempar ulang exception");
throw;
}
}
catch (ArgumentException)
{
Console.WriteLine("Exception yang sama ditangkap di lapisan luar");
}Output yang Dihasilkan:
Catat log, lalu lempar ulang exception
Exception yang sama ditangkap di lapisan luarBlok dalam menangkap exception, mencatat log, lalu throw; meneruskan exception yang sama. Blok luar kemudian menangkapnya kembali.