Exception bawaan cukup untuk kegagalan umum: format salah, angka meluap, pembagian nol. Namun kegagalan bisnis punya nama sendiri — pesanan melebihi stok, pembayaran ditolak, kupon kedaluwarsa. Mencampur kegagalan semacam ini ke Exception umum membuat pemanggil sulit membedakannya. Solusinya adalah custom exception: tipe exception yang kita definisikan sendiri.

Class Exception Sederhana #

Ini pertama kalinya kita mendeklarasikan class secara formal. Class adalah cetakan yang menggabungkan data dan perilaku dalam satu unit; bahasannya menyeluruh pada section Pemrograman Berorientasi Objek. Untuk saat ini, kita cukup membaca deklarasi berikut: class StokTidakCukupException mewarisi (:) System.Exception, sehingga objeknya berperilaku seperti exception biasa. Constructor-nya menerima pesan lalu meneruskannya ke constructor class induk lewat : base(pesan).

csharp
public class StokTidakCukupException : Exception
{
    public StokTidakCukupException(string pesan)
        : base(pesan)
    {
    }
}

Aturan yang diikuti contoh di atas:

  • Nama class berakhiran Exception — konvensi yang dipakai seluruh ekosistem .NET.
  • Class mewarisi Exception (atau keturunannya), sehingga objeknya bisa dilempar dengan throw dan ditangkap dengan catch.
  • Constructor meneruskan pesan ke base agar properti Message terisi.

Menggunakan Custom Exception #

csharp
int stokBuku = 3;
int jumlahPesanan = 7;

try
{
    if (jumlahPesanan > stokBuku)
    {
        throw new StokTidakCukupException($"Stok tidak cukup: tersedia {stokBuku} buah, diminta {jumlahPesanan} buah");
    }

    Console.WriteLine("Pesanan diproses");
}
catch (StokTidakCukupException ex)
{
    Console.WriteLine($"Pesanan ditolak: {ex.Message}");
}

Console.WriteLine("Kasir kembali siap melayani pembeli berikutnya");

Output yang Dihasilkan:

text
Pesanan ditolak: Stok tidak cukup: tersedia 3 buah, diminta 7 buah
Kasir kembali siap melayani pembeli berikutnya

Mari kita telaah baris demi baris:

  1. Baris 7-9 (if (jumlahPesanan > stokBuku)): Aturan bisnis diperiksa terlebih dahulu; pesanan 7 buah melampaui stok 3 buah.
  2. Baris 10 (throw new StokTidakCukupException(...)): Kegagalan dilaporkan dengan tipe yang menggambarkan kegagalannya, bukan dengan Exception generik.
  3. Baris 14 (catch (StokTidakCukupException ex)): Catch menargetkan tipe custom, sehingga kegagalan stok terpisah rapi dari kegagalan lain — FormatException tidak akan masuk ke blok ini.

Pemisahan berdasarkan tipe inilah keunggulan utama custom exception. Bila pesanan gagal karena format jumlah salah dan karena stok kurang, dua catch berbeda menerima dua tipe berbeda, dan kebingungan “gagal karena apa” tidak terjadi. Bila kebutuhannya berkembang — misalnya pesan harus menyertakan sisa stok — class tersebut cukup ditambah properti tanpa mengubah pemanggilnya.