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).
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 denganthrowdan ditangkap dengancatch. - Constructor meneruskan pesan ke
baseagar propertiMessageterisi.
Menggunakan Custom Exception #
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:
Pesanan ditolak: Stok tidak cukup: tersedia 3 buah, diminta 7 buah
Kasir kembali siap melayani pembeli berikutnyaMari kita telaah baris demi baris:
- Baris 7-9 (
if (jumlahPesanan > stokBuku)): Aturan bisnis diperiksa terlebih dahulu; pesanan 7 buah melampaui stok 3 buah. - Baris 10 (
throw new StokTidakCukupException(...)): Kegagalan dilaporkan dengan tipe yang menggambarkan kegagalannya, bukan denganExceptiongenerik. - Baris 14 (
catch (StokTidakCukupException ex)): Catch menargetkan tipe custom, sehingga kegagalan stok terpisah rapi dari kegagalan lain —FormatExceptiontidak 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.