例外の概念はソフトウェアエンジニアリングの分野ではまだ十分に成熟していないため、例外には有用な詳細が含まれていません。
はい、IndexOutOfRangeException
範囲外の正確なインデックスと、スローされた時点で有効だった範囲を含める必要があり、.NETランタイムの作成者に代わって軽視することはできません。はい、Oracleのtable or view not found
例外には、検出されなかったテーブルまたはビューの名前を含める必要があります。また、このことを担当するすべてのユーザーに代わって、軽視することはできません。
大部分は、混乱は、例外には人間が読み取れるメッセージを含めるべきであるという誤った当初の考えに由来し、その例外はすべての例外についての理解の欠如に起因するため、悪循環です。
人は例外に人間が読めるメッセージを含めるべきだと考えているため、例外によって運ばれる情報も人間が読めるメッセージにフォーマットする必要があると考えており、人間が読めるすべてのメッセージを書くことに退屈しているコードを作成するか、そうすることで、pr索好きな目がメッセージを見るかもしれないものに、不適切な量の情報を漏らしてしまうのではないかと恐れています。(他の回答で言及されているセキュリティ問題。)
しかし、問題の真実は、例外が人間が読めるメッセージを含むべきではないため、彼らはそれを心配するべきではないということです。例外とは、プログラマーだけが見たり対処したりするべきものです。障害情報をユーザーに提示する必要がある場合は、非常に高いレベルで、洗練された方法で、統計的には英語ではないユーザーの言語で行う必要があります。
したがって、プログラマにとって、例外の「メッセージ」は例外のクラス名であり、例外に関連する他の情報はすべて、例外オブジェクトの(最終/読み取り専用)メンバー変数にコピーする必要があります。可能であれば、考えられるすべての要素を少しずつ。この方法では、メッセージを生成する必要がない(または生成する必要がない)ため、pr索好きな目には見えません。
以下のコメントでトーマス・オーエンズが表明した懸念に対処するには:
はい、もちろん、あるレベルでは、例外に関するログメッセージを作成します。しかし、あなたはあなたが言っていることに問題を既に見ています:一方では、スタックトレースのない例外ログメッセージは役に立たないが、他方では、ユーザーに例外スタックトレース全体を見せさせたくない。繰り返しますが、ここでの問題は、私たちの視点が従来の慣行によって歪められていることです。ログファイルは従来、プレーンテキストでしたが、これは私たちの学問がまだ始まったばかりの頃は問題なかったかもしれませんが、おそらくもうそうではありません。セキュリティ上の懸念がある場合、ログファイルはバイナリまたは暗号化する必要があります。
バイナリテキストでもプレーンテキストでも、ログファイルは、アプリケーションがデバッグ情報をシリアル化するストリームと考える必要があります。このようなストリームはプログラマーの目だけのものであり、例外のデバッグ情報を生成するタスクは、例外をデバッグログストリームにシリアル化するのと同じくらい簡単にする必要があります。このように、ログを見ると、例外クラス名(既に述べたように、すべての実用的な目的のための「メッセージ」)が表示されます。そして、ログに含めるのが実用的で、スタックトレース全体です。このプロセスでは、人間が読み取れる例外メッセージのフォーマットが顕著に欠落していることに注意してください。
PS
この主題に関する私の考えのもう少しはこの答えで見つけることができます:よい例外メッセージを書く方法
PPS
バイナリログファイルについての私の提案によって多くの人がチェックされているように見えるので、ここで提案しているのはログファイルがバイナリであるべきではないことをさらに明確にするためにもう一度答えを修正しましたが、必要に応じて、ログファイルをバイナリにすることができます。