4

この質問は多くのベスト プラクティスの本で取り上げられていると思いますが、それでも... ほとんどの場合、カスタム例外の間違った使い方の例を目にします。

特に、現在、コンパイラ コースのタイプ チェッカーに取り組んでいます。そのため、Map にかなり似た SymbolTable クラスがあります。通常のマップとの主な違いは、各シンボルを定義する必要があることです。そのため、挿入しようとしているキーが SymbolTable に既に存在する場合、put(String, Object) 操作は失敗するはずです。

ここで質問があります。キーを挿入しようとするときに、そのキーが既に SymbolTable に存在する場合、SymbolTable はどのように動作する必要がありますか? 私たちは持っているべきですか

boolean insert(String key, Object value);

挿入が失敗した場合に「false」を返すメソッド?または、戻り値「void」を持ち、重複値が検出されたときに例外をスローする挿入メソッドを使用する必要がありますか?

前もって感謝します:)

4

4 に答える 4

3

例外は、例外的な場合にスローする必要があります。

その特定のケースでは、たとえば、メソッドに名前が付けられている場合、すでにリストキーinsert()にあるものを通常のケースとして扱い、それを更新します。

さらに、コードフローを制御するために例外を使用するべきではありませんが、失敗/成功を示すブール値を返すことも適切なオプションではありません(失敗の場合が多く、Falseは問題について何も示しません)。

結論として、私はこれを次のように実行します。

// Failures can happen 
void add(key, value) throws AlreadyOnMapException

// Update if already on list
void insert(key, value);

// Make available Contains() methods to control the flow by avoiding exceptions
boolean containsKey(key);

boolean containsValue(value);
于 2011-11-01T04:13:31.010 に答える
2

例外を使用するか戻り値を使用するかを決定することは、いくつかの「力」のバランスです。

  • 呼び出し元は戻り値を無視して次の行に進むことができますが、例外を無視することはできません。例外は、問題を無視して続行すると、より大きな問題につながる可能性がある場合に使用される傾向があります。
  • 例外を処理するコードは戻り値をチェックするよりも複雑であるため、例外は呼び出し元に負担をかけます。そのため、単純な戻り値で十分な場合は、しばしば回避されます。
  • 一方、例外は、何か問題が発生した場合にスタックが別の場所のブロックに巻き戻されることを信頼できるため、結果をチェックする負担から直接呼び出し元を解放できます。catch
  • 例外処理は通常の return よりも複雑であるため、頻繁にスローされるとパフォーマンスが低下します。例外は通常、頻繁に発生することが予想されない状況で使用されます。
  • エラー情報と「通常の」結果が異なるタイプの場合、通常、例外をスローする方が、関連のないものを同じ戻り値に押し込むよりも優れています (たとえばObject、文字列または数値のいずれかを返すことができるようにメソッドを返すようにするなど)。

シンボルテーブルの例では、コードを単純にする可能性が高いため、おそらく false を返すだけですが、プログラムの残りの部分の設計によっては、どちらでも妥当な場合があります。

于 2011-11-01T04:11:59.560 に答える
0

それは、実際に何が起こると予想されるかによって異なります。あなたの挿入例を使用すると、重複があることが予想されますか、それとも重複があるのは異常ですか? 状況が異常である場合 (つまり、通常起こらないこと)、それは例外的です。

すべきでないことは、フロー制御に例外を使用することです。たとえば、10% の確率で重複が予想される場合、例外を使用しても効果がありません。しかし、入れるべきではないのに複製を入れたのがプログラマー側のエラー (つまり、予期しないアクション) である場合は、おそらく例外が適切です。

これは死ぬまで議論されていますが、少し調べてみてください。

于 2011-11-01T04:03:39.827 に答える
0
User defined exceptions: when do we use them?

多くの本で、カスタムベースの例外を使用するシナリオが非常に明確に定義されていると確信しています。しかし最近、ロギングを改善するために、カスタムベースの例外の興味深い使用法を観察しました。たとえば、クラス A の関数はクラス B の関数を呼び出し、クラス B の関数はクラス C の関数を呼び出します。これらの関数はすべて IO 例外をスローできます。そのため、クラス C 関数で IO 例外が発生した場合は、その例外をキャッチしてログに記録し、カスタム ベースの例外のオブジェクトを作成してそのオブジェクトをスローします。すべての呼び出し関数は、他の例外とともにカスタムベースの例外をキャッチし、カスタムベースの例外をキャッチするたびに、冗長であるためログに記録せず、単にスローバックします。

于 2011-11-01T04:12:04.867 に答える