2016-08-12 5 views
0

オブジェクトからプロパティを取得し、pdfに値を設定するコードを記述しています。Dictionaryにキーが含まれていない場合は例外をスローすることはできますか

私は私の辞書からアイテムを取得するために使用するコードは以下の通りです:辞書がどのように見える

 public static int? GetYPrintCoord(string word) 
     { 
      // Try to get the result in the static Dictionary 
      PrintCoord result; 
      if (Dict.TryGetValue(word, out result)) 
      { 
       return result.Y; 
      } 
      else 
      { 
       return null; 
      } 
     } 

Dictionary<string, PrintCoord> Dict = new Dictionary<string, PrintCoord>(); 

事は、私はヌルをチェックするのはうんざりだときGetYPrintCoord(string word)が呼び出されます。実際には、辞書内の項目が存在しない場合、誤ったデータが含まれるため、pdf全体が生成する価値がありません。私は方法を変更する代わりに、考えていた:

public static int GetYPrintCoord(string word) 
    { 
     // Try to get the result in the static Dictionary 
     PrintCoord result; 
     if (Dict.TryGetValue(word, out result)) 
     { 
      return result.Y; 
     } 
     else 
     { 
      throw new KeyNotFoundException(); 
     } 
    } 

これは悪い習慣ですか?例外を投げてクラッシュさせると、実際にはユーザーの方がずっと良くなるでしょう。なぜなら、少なくともユーザーは無効なpdfを見ず、それが無効であることを知らないかもしれないからです。キーが見つからない

PrintCoord result = Dict[word]; // is equivalent to your code. 

場合は、例外がスローされます。あなたは、例外をスローする前に、いくつかのロギングを行う必要がない限り、あなたは車輪の再発明している

+0

[CodeReview](http://codereview.stackexchange.com/) – Marusyk

+1

に属しているため、この質問を議論の対象外としています:キーは辞書にあるべきですか?単純にアクセスする必要がある場合(下の図を参照) –

+2

必要以上にコードを書くのはあなたですか?辞書にインデックスをつけて、KeyNotFoundExceptionをスローするのはなぜでしょうか?代わりに、あなたがその例外を発生させたくないので、その例外を投げるのを避けるように設計された代替アクセスメカニズム( 'TryGetValue')を使用しています。 –

答えて

7

が、これは組み込みの動作です。

したがって、キーが辞書に見つからないと思われる場合、基本的にはTryGetValueを使用しますが、それでも問題はありません。 2番目のケースは、try...catchを使用せず、単純なif文を使用してキーが見つからない場合を処理する場合です。

+0

これはうまく動作します。愚かな質問だった。私はずっと前から辞書を使っていません。 – Jeeves

2

例外は、名前が示すように、例外的な場合を表します。

辞書にキーが見つからなかったということは、何かが間違っていた場合、つまりになるはずのものではない場合は、例外が当てはまる可能性があります。

つまり、必要なキーが見つからないことが予想される場合、例外が意味をなさない可能性があります。できることは、GetYPrintCoordメソッドの名前をTryGetYPrintCoordと変更することができます。次に、メソッドがブール値を返し、キーが見つかった場合はTrue、それ以外の場合はFalseを返し、outキーワードを使用して辞書の値を戻します。

関連する問題