Dalam pertanyaan yang lebih baru ini saya menyatakan bahwa pengecualian tidak boleh mengandung pesan sama sekali. Menurut pendapat saya, fakta yang mereka lakukan adalah kesalahpahaman yang sangat besar. Yang saya usulkan adalah itu
"Pesan" dari pengecualian adalah nama kelas (yang memenuhi syarat) pengecualian.
Pengecualian harus mengandung dalam variabel anggotanya sendiri sebanyak mungkin detail tentang apa yang terjadi; misalnya, IndexOutOfRangeException
harus berisi nilai indeks yang ditemukan tidak valid, serta nilai-nilai atas dan bawah yang berlaku pada saat pengecualian dilemparkan. Dengan cara ini, menggunakan refleksi Anda dapat memiliki pesan yang dibuat secara otomatis yang berbunyi seperti ini: IndexOutOfRangeException: index = -1; min=0; max=5
dan ini, bersama dengan jejak tumpukan, harus menjadi semua informasi objektif yang Anda butuhkan untuk memecahkan masalah. Memformatnya menjadi pesan cantik seperti "index -1 tidak antara 0 dan 5" tidak menambah nilai apa pun.
Dalam contoh khusus Anda, NodePropertyNotFoundException
kelas akan berisi nama properti yang tidak ditemukan, dan referensi ke simpul yang tidak mengandung properti. Hal ini penting: harus tidak berisi nama node; itu harus berisi referensi ke simpul yang sebenarnya. Dalam kasus khusus Anda ini mungkin tidak perlu, tetapi ini adalah masalah prinsip dan cara berpikir yang lebih disukai: perhatian utama ketika membangun pengecualian adalah bahwa itu harus dapat digunakan oleh kode yang mungkin menangkapnya. Kegunaan oleh manusia adalah hal yang penting, tetapi hanya masalah sekunder.
Ini menangani situasi yang sangat membuat frustrasi yang mungkin Anda saksikan pada suatu saat dalam karir Anda, di mana Anda mungkin telah menangkap pengecualian yang berisi informasi penting tentang apa yang terjadi dalam teks pesan, tetapi tidak di dalam variabel anggotanya, sehingga Anda harus melakukan penguraian string teks untuk mencari tahu apa yang terjadi, berharap bahwa teks pesan akan tetap sama di versi masa depan dari lapisan yang mendasarinya, dan berdoa agar teks pesan tidak akan dalam beberapa bahasa asing ketika program Anda dijalankan di negara lain.
Tentu saja, karena nama kelas pengecualian adalah pesan pengecualian, (dan variabel anggota pengecualian adalah detail spesifik), ini berarti bahwa Anda memerlukan banyak dan banyak pengecualian berbeda untuk menyampaikan semua pesan yang berbeda, dan ini baik saja.
Sekarang, kadang-kadang, ketika kita menulis kode, kita menemukan situasi yang salah di mana kita hanya ingin cepat kode throw
pernyataan dan melanjutkan penulisan kode kita daripada harus mengganggu apa yang kita lakukan untuk membuat kelas pengecualian baru sehingga kita bisa lempar ke sana. Untuk kasus ini, saya memiliki GenericException
kelas yang sebenarnya menerima pesan string sebagai parameter waktu konstruksi, tetapi konstruktor dari kelas pengecualian ini dihiasi dengan FIXME XXX TODO
komentar ungu terang besar yang sangat besar yang menyatakan bahwa setiap instance dari kelas ini harus diganti dengan instantiasi dari beberapa kelas pengecualian yang lebih terspesialisasi sebelum sistem perangkat lunak dirilis, lebih disukai sebelum kode dikomit.