Возврат исключений под разными именами? Какая стандартная практика? - PullRequest
4 голосов
/ 17 сентября 2009

В настоящее время у меня есть этот клиентский код в моем веб-приложении PHP MVC:

try {
  BookMapper::insert($book);
} catch (DbUniqueConstraintViolationException $e) {
  $errorList->addMessage($book . " already exists!");
}

Мне интересно, что это плохая практика - ссылаться на низкоуровневую структуру Db * исключения для моего клиентского кода? Если так, я должен скорректировать свой код модели следующим образом:

class BookAlreadyExistsException extends Exception { }

class BookMapper {
  public static function insert($book) {
    try {
      // call to DB-layer to insert $book
      // (not relevant to the question)
    } catch (DbUniqueConstraintViolationException $e) {
      throw new BookAlreadyExistsException();
    }
  }
}

и затем используйте этот новый код клиента ...

try {
  BookMapper::insert($book);
} catch (BookAlreadyExistsException $e) {
  $errorList->addMessage($book . " already exists!");
}

Или что-то еще? Или оригинальный метод хорошо?

Спасибо!

РЕДАКТИРОВАТЬ: просто хочу добавить, последний метод считывает лучший IMO, но он идет с накладными расходами создания / повторного бросания объекта и, что более важно, он требует дублирования кода повторного бросания в методе insert () каждого преобразователя. Первый способ прост в реализации, уловке и работает для любой модели, но я помню, что читал где-то, что вы не должны делать это таким образом?

Ответы [ 2 ]

2 голосов
/ 17 сентября 2009

Я думаю, что вы должны определенно бросить свое собственное исключение.

Но я бы также рассмотрел третий вариант: метод вставки возвращает true для успеха и false для ошибки. Исключения следует использовать для исключений, и тот факт, что книга уже существует, может быть ожидаемым / предсказуемым случаем.

И если дубликаты книг действительно являются исключениями, которые не должны быть возможны (если только нет ошибок программирования), то вы также можете придерживаться исключения из базы данных, но в этом случае его не поймать. Пусть он пузырится до самого конца.

1 голос
/ 17 сентября 2009

Я настоятельно рекомендую эту статью . Хотя он написан для Java, принципы вполне применимы и к PHP. В нем содержатся хорошие рекомендации относительно того, какие типы исключений вы должны создавать и перехват.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...