Exception
adalah tipe dasar untuk semua pengecualian, dan karenanya sangat tidak spesifik. Anda tidak boleh membuang pengecualian ini karena tidak mengandung informasi yang berguna. Penangkapan kode panggilan untuk pengecualian tidak dapat menghilangkan ambiguitas pengecualian yang sengaja dilemparkan (dari logika Anda) dari pengecualian sistem lain yang sama sekali tidak diinginkan dan menunjukkan kesalahan nyata.
Alasan yang sama juga berlaku untuk SystemException
. Jika Anda melihat daftar jenis turunan, Anda dapat melihat sejumlah besar pengecualian lain dengan semantik yang sangat berbeda.
NullReferenceException
dan IndexOutOfRangeException
dari jenis yang berbeda. Sekarang ini adalah pengecualian yang sangat spesifik, jadi membuangnya bisa saja tidak masalah. Namun, Anda tetap tidak ingin membuang ini, karena biasanya itu berarti ada beberapa kesalahan aktual dalam logika Anda. Misalnya pengecualian referensi null berarti Anda mencoba mengakses anggota objek yang null
. Jika itu adalah kemungkinan dalam kode Anda, Anda harus selalu memeriksa secara eksplisit null
dan melemparkan pengecualian yang lebih berguna sebagai gantinya (misalnya ArgumentNullException
). Demikian pula, IndexOutOfRangeException
s terjadi ketika Anda mengakses indeks yang tidak valid (pada array — bukan daftar). Anda harus selalu memastikan bahwa Anda tidak melakukan itu di tempat pertama dan memeriksa batas-batas misalnya array terlebih dahulu.
Ada beberapa pengecualian lain seperti keduanya, misalnya InvalidCastException
atau DivideByZeroException
, yang diberikan untuk kesalahan tertentu dalam kode Anda dan biasanya berarti Anda melakukan sesuatu yang salah atau Anda tidak memeriksa beberapa nilai yang tidak valid terlebih dahulu. Dengan membuangnya secara sadar dari kode Anda, Anda hanya mempersulit kode pemanggil untuk menentukan apakah mereka terlempar karena beberapa kesalahan dalam kode, atau hanya karena Anda memutuskan untuk menggunakannya kembali untuk sesuatu dalam implementasi Anda.
Tentu saja, ada beberapa pengecualian (hah) untuk aturan ini. Jika Anda sedang membangun sesuatu yang dapat menyebabkan pengecualian yang sama persis dengan yang sudah ada, silakan gunakan itu, terutama jika Anda mencoba untuk mencocokkan beberapa perilaku bawaan. Pastikan Anda memilih jenis pengecualian yang sangat spesifik.
Namun secara umum, kecuali Anda menemukan pengecualian (spesifik) yang memenuhi kebutuhan Anda, Anda harus selalu mempertimbangkan untuk membuat jenis pengecualian Anda sendiri untuk pengecualian khusus yang diharapkan. Terutama saat Anda menulis kode perpustakaan, ini bisa sangat berguna untuk memisahkan sumber pengecualian.