1

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 は何が問題なのかを詳細に教えてくれます。例外が発生したときに詳細情報を取得するために、このようにすべてのコードをラップすることはできません。

4

5 に答える 5

0

null を確認するか、キーが欠落しているかどうかを確認する責任は、開発者にあります。この理由は最適化です。デフォルトの例外が希望どおりに詳細である場合、コンパイラは効率的に最適化できません。

それはトレードオフです。null チェックを追加するのは煩わしいかもしれませんが、それが言語の設計方法です。

于 2013-09-17T16:42:00.410 に答える