Я создаю метод в модели 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
, но это кажется немного родовым для этого случая использования:
Exception, который представляет ошибку в логике программы. Подобные исключения должны непосредственно привести к исправлению в вашем коде.
Есть ли лучший выбор здесь? Правильны ли мои наблюдения? Каким будет наиболее подходящее исключение SPL для броска при попытке добавить дубликат в коллекцию, которая должна содержать уникальные значения?
Я не знаю, что делает 'addCode()', но независимо от того, молчали ли вы игнорировать дубликаты или возбуждать исключение, сводится к тому, насколько это опасно. Если вы можете безопасно ничего не делать, когда 'addCode()' вызывается несколько раз с тем же параметром, и это не было бы удивительным поведением для разработчика, то я не думаю, что вам нужно указать это условие вообще, либо с исключение или возвращаемое значение. Если пользователь * действительно * должен знать, он может использовать 'hasCode()'. Если, однако, этот метод более опасен, а сбой - это большая проблема, выведите исключение. В любом случае, это может быть слишком опасно для использования. –
Обратите внимание, что это также изменило бы характер вашего первоначального теста - вы больше не будете тестировать открытый интерфейс, но должны будете проверить внутреннее, возможно, личное состояние объекта, чтобы убедиться, что код не был добавлен дважды. –