0

Doctrineモデルに関連オブジェクトをコレクションに追加するメソッドを作成していますが、重複するオブジェクトがそのコレクションに追加されたときに例外をスローしたいと思います。

テストは次のとおりです。

public function testFluentInterface(  )
{
  $sport = new Sport();
  $this->assertSame($sport, $sport->addCode('ANY'),
    'Expected Sport to implement fluent interface.'
  );
}

public function testCannotAddSameCodeMoreThanOnce(  )
{
  $code = 'BAZ';

  $sport = new Sport();
  $sport->addCode($code);

  try
  {
    $sport->addCode($code);
    $this->fail(
      'Expected error when trying to add the same code to a sport more than once.'
    );
  }
  catch( /*SomeKindOf*/Exception $e )
  {
  }
}

最初は、この場合にをスローするのが適切かもしれないと思いましたが、OverflowException「この値はすでに存在します」が「このコンテナがいっぱいです」と同じかどうかはわかりません。

完全なコンテナに要素を追加すると例外がスローされます。

ありますがUnexpectedValueException、タイプが正しくない変数に当てはまるようです。

値が値のセットと一致しない場合にスローされる例外。通常、これは、関数が別の関数を呼び出し、戻り値が特定のタイプまたは値であり、算術エラーまたはバッファ関連のエラーを含まないことを期待している場合に発生します。

私はいつでも使用できますLogicExceptionが、これはこのユースケースでは少し一般的なようです。

プログラムロジックのエラーを表す例外。この種の例外は、コードの修正に直接つながるはずです。

ここにもっと良い選択肢はありますか?私の観察は正しいですか?一意の値を含む必要があるコレクションに複製を追加しようとするときにスローする最も適切なSPL例外は何でしょうか。

4

3 に答える 3

1

本当に適合する SPL 例外はありません。独自の例外を作成する方がよい場合があります。

/**
 * Raised when item is added to a collection multiple times. 
 */
class DuplicateException extends RuntimeException {}; 

この場合の例外のスローは、配列内の同じキーに同じ値を割り当てるたびに例外をスローするのと同じように、少し極端に思えます。このケースを検出するために、例外の代わりに戻り値を使用することを検討しましたか?

于 2011-11-29T17:22:53.873 に答える
0

たとえば、Java Collection Framework (つまり Set) の多くのクラスは、このような場合に例外をスローせず、false を返します。

個人的にはその通りに行きます。

于 2011-11-29T17:10:49.257 に答える