C# の例外は、提供される情報が非常に少ないため、非常に煩わしいと思います。これの理由は何ですか?
NullReferenceException または KeyNotFoundExceptions はデバッグが難しく、スタックトレースで行番号を取得できない場合があります。例外自体が詳細情報を提供できないのはなぜですか?
例えば:
private Dictionary<string, object> Properties = null;
public void Process(string key)
{
var item = this.Properties[key];
....
}
"Properties" が null の場合、NullReferenceException が発生します。
「System.NullReferenceException: オブジェクト参照がオブジェクトのインスタンスに設定されていません」
取得できない理由:
「System.NullReferenceException: オブジェクト参照'Properties'がオブジェクトのインスタンスに設定されていません」
これはより便利であり、CLR はどの参照が null であるかを認識しています。
Process("dummy") など、存在しないキーを渡す場合も同様です。
「System.Collections.Generic.KeyNotFoundException: 指定されたキーがディクショナリに存在しませんでした」
取得できない理由:
「System.Collections.Generic.KeyNotFoundException: キー'ダミー'が辞書に存在しませんでした」
CLR は、どのキーが渡されて見つからなかったのかを認識しています。
生産的な環境でそのようなエラー (不正なキーが渡される) をデバッグしようとし、コードを次のようにより堅牢にしました。
private Dictionary<string, object> Properties = null;
public void Process(string key)
{
if (this.Properties != null)
{
if (this.Properties.ContainsKey(key))
{
var item = this.Properties[key];
...
}
else
{
throw new KeyNotFoundException(string.Format("The key '{0}' was not found.", key));
}
}
else
{
throw new NullReferenceException(string.Format("The object 'Properties' is null."));
}
}
しかし、なぜ私がこれをしなければならないのか、通常、CLR は何が問題なのかを詳細に教えてくれます。例外が発生したときに詳細情報を取得するために、このようにすべてのコードをラップすることはできません。