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 #

csharp
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:

text
Terjadi galat: Jumlah orang tidak boleh nol
Program melanjutkan eksekusi

Mari kita telaah baris demi baris:

  1. Baris 14-21 (method BagiTotal): Method memeriksa syaratnya sendiri sebelum bekerja; pengecekan di awal seperti ini disebut guard clause.
  2. 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.
  3. Baris 3 (BagiTotal(120000, 0)): Pemanggilan dengan penyebut 0 menghentikan method di tengah jalan; baris return tidak pernah dieksekusi.
  4. 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.

csharp
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:

text
Catat log, lalu lempar ulang exception
Exception yang sama ditangkap di lapisan luar

Blok dalam menangkap exception, mencatat log, lalu throw; meneruskan exception yang sama. Blok luar kemudian menangkapnya kembali.