以不同的名义重新划分异常?什么是标准做法?

时间:2009-09-17 05:38:03

标签: php exception

目前我的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 个答案:

答案 0 :(得分:2)

我认为你应该明确地抛出自己的异常。

但我也会考虑第三个选项,即让insert方法为成功返回true,为失败返回false。异常应该用于例外情况,而且已经存在的图书实际上可能是一个预期/可预测的案例。

如果重复的书籍确实是不可能的(除非编程错误),那么你也可以坚持数据库异常,但在这种情况下不要抓住它。让它一直冒出来。

答案 1 :(得分:1)

我强烈推荐this article。虽然它是为Java编写的,但这些原则也非常适用于PHP。对于应该抛出捕获的异常类型,它有很好的指导。