目前我的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()方法中复制重新抛出代码。前一种方法易于实现,可以捕获并适用于任何模型,但我记得在某处读过你不应该这样做吗?
答案 0 :(得分:2)
我认为你应该明确地抛出自己的异常。
但我也会考虑第三个选项,即让insert方法为成功返回true,为失败返回false。异常应该用于例外情况,而且已经存在的图书实际上可能是一个预期/可预测的案例。
如果重复的书籍确实是不可能的(除非编程错误),那么你也可以坚持数据库异常,但在这种情况下不要抓住它。让它一直冒出来。
答案 1 :(得分:1)
我强烈推荐this article。虽然它是为Java编写的,但这些原则也非常适用于PHP。对于应该抛出和捕获的异常类型,它有很好的指导。