gpt4 book ai didi

php - 以不同的名称重新抛出异常?什么是标准做法?

转载 作者:可可西里 更新时间:2023-10-31 23:26:28 25 4
gpt4 key购买 nike

目前我的 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() 方法中复制重新抛出代码。前一种方法易于实现和捕捉,适用于任何模型,但我记得在某处读到过你不应该这样做?

最佳答案

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

但我还会考虑第三种选择,即让插入方法在成功时返回 true,在失败时返回 false。异常(exception)应该用于异常(exception),并且一本书已经存在的事实实际上可能是一种预期/可预测的情况。

如果重复的书籍确实是不应该出现的异常(exception)情况(除非编程错误),那么您也可以坚持使用数据库异常,但在那种情况下不要捕获它。让它一直冒泡。

关于php - 以不同的名称重新抛出异常?什么是标准做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1436868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com