Pengecualian tidak mengandung perincian yang berguna karena konsep pengecualian belum cukup matang dalam disiplin rekayasa perangkat lunak, sehingga banyak programmer tidak memahaminya sepenuhnya, dan oleh karena itu mereka tidak memperlakukannya dengan baik.
Ya, IndexOutOfRangeException
harus berisi indeks tepat yang berada di luar jangkauan, serta kisaran yang valid pada saat dilempar, dan itu hina atas nama pencipta runtime .NET yang tidak. Ya, table or view not found
pengecualian Oracle harus berisi nama tabel atau tampilan yang tidak ditemukan, dan lagi, fakta bahwa itu tidak dapat dihina atas nama siapa pun yang bertanggung jawab untuk ini.
Sebagian besar, kebingungan berasal dari ide asli yang salah arah bahwa pengecualian harus mengandung pesan yang dapat dibaca manusia, yang pada gilirannya berasal dari kurangnya pemahaman tentang apa yang dimaksud dengan pengecualian, sehingga merupakan lingkaran setan.
Karena orang berpikir bahwa pengecualian harus mengandung pesan yang dapat dibaca manusia, mereka percaya bahwa informasi apa pun yang dibawa oleh pengecualian juga harus diformat ke dalam pesan yang dapat dibaca manusia, dan kemudian mereka bosan untuk menulis semua pesan yang dapat dibaca manusia- membuat kode, atau mereka takut melakukan hal itu akan membocorkan informasi yang tidak disarankan kepada mata yang memandangi pesan itu. (Masalah keamanan disebutkan oleh jawaban lain.)
Tetapi kebenaran dari masalah ini adalah bahwa mereka tidak perlu khawatir tentang itu karena pengecualian tidak boleh mengandung pesan yang bisa dibaca manusia. Pengecualian adalah hal-hal yang hanya harus dilihat dan / atau ditangani oleh programmer. Jika ada kebutuhan untuk menyajikan informasi kegagalan kepada pengguna, itu harus dilakukan pada tingkat yang sangat tinggi, dengan cara yang canggih, dan dalam bahasa pengguna, yang, secara statistik, tidak mungkin berbahasa Inggris.
Jadi, bagi kita programmer, "pesan" pengecualian adalah nama kelas pengecualian , dan apa pun informasi lain yang berkaitan dengan pengecualian harus disalin ke variabel anggota (terakhir / hanya baca) dari objek pengecualian. Lebih disukai, setiap hal dapat dibayangkan. Dengan cara ini, tidak ada pesan yang perlu (atau harus) dihasilkan, dan karenanya tidak ada mata yang mengintip yang bisa melihatnya.
Untuk mengatasi kekhawatiran yang diungkapkan oleh Thomas Owens dalam komentar di bawah:
Ya, tentu saja, pada tingkat tertentu, Anda akan membuat pesan log tentang pengecualian. Tapi Anda sudah melihat masalah dengan apa yang Anda katakan: di satu sisi, pesan log pengecualian tanpa jejak tumpukan tidak berguna, tetapi di sisi lain, Anda tidak ingin membiarkan pengguna melihat seluruh jejak jejak pengecualian. Sekali lagi, masalah kita di sini adalah bahwa perspektif kita condong oleh praktik tradisional. File log secara tradisional dibuat dalam teks biasa, yang mungkin baik-baik saja ketika disiplin kita masih dalam masa pertumbuhan, tetapi mungkin tidak lagi: jika ada masalah keamanan, maka file log harus berupa biner dan / atau dienkripsi.
Apakah biner atau teks biasa, file log harus dianggap sebagai aliran ke mana aplikasi membuat serial informasi debug. Aliran seperti itu hanya untuk mata programmer, dan tugas menghasilkan informasi debug untuk pengecualian harus sesederhana serialisasi pengecualian ke dalam stream log debug. Dengan cara ini, dengan melihat log Anda bisa melihat nama kelas pengecualian, (yang, seperti telah saya sebutkan, adalah untuk semua tujuan praktis "pesan",) masing-masing variabel anggota pengecualian yang menggambarkan segala sesuatu yang berkaitan - dan-praktis-untuk-memasukkan-dalam-log, dan seluruh jejak tumpukan. Perhatikan bagaimana pemformatan pesan pengecualian yang dapat dibaca manusia jelas hilang dari proses ini.
PS
Beberapa pemikiran saya mengenai hal ini dapat ditemukan dalam jawaban ini: Cara menulis pesan pengecualian yang baik
PPS
Tampaknya banyak orang dicentang oleh saran saya tentang file log biner, jadi saya mengubah jawaban sekali lagi untuk membuatnya lebih jelas bahwa apa yang saya sarankan di sini bukanlah bahwa file log harus biner, tetapi itu file log mungkin biner, jika perlu.