这是一段代码,我想知道是否应该对其进行重构以使其更符合 Clean Code 实践。
这是一个负责退还客户下订单的类。
class RefundServiceInvoker {
private $_orders;
public function refundOrder() {
$this->getOrdersFromDB(); //This function gets all orders from DB and sets $_orders
foreach ($this->_orders as $order) {
try {
$order->refund(); //Some lines may throw an exception when refunded due to some business logic (ex. the order was already shipped)
$this->updateOrderStatus('refunded')
} catch (Exception $e) {
$this->logError($e);
$this->sendMailToAdmin();
}
}
}
}
当然,这段代码比我的原始代码高度简化。
我的主要问题是如果
$order->refund();
抛出异常,它将被捕获并记录到数据库中,然后发送邮件。但是如果 $this->logError($e);
本身抛出异常?或者如果邮件服务器关闭并抛出异常怎么办?如果数据库本身关闭并且
$this->getOrdersFromDB();
会怎样?抛出异常?我的第一个解决方案是将所有东西都包装成一个大
try{}catch{}
:public function refundOrder() {
try {
$this->getOrdersFromDB(); //This function gets all orders from DB and sets $_orders
foreach ($this->_orders as $order) {
$order->refund(); //Some lines may throw an exception when refunded due to some business logic (ex. the order was already shipped)
$this->updateOrderStatus('refunded')
} catch (Exception $e) {
$this->logError($e);
$this->sendMailToAdmin();
}
}
}
但这意味着如果一个订单失败,那么所有订单都失败了!!我应该放 2
try{}catch{}
一个用于整个功能,另一个用于每个订单?但在这种情况下,catch 中的函数也可能抛出一个不会被捕获的异常。笔记:
该应用程序是使用 Zend 框架 1.11.11 构建的。
提前致谢。
最佳答案
没有 Elixir 可以解决此类问题。如果一个函数可以抛出并且你关心它,你必须包装 try
/catch
围绕它——就这么简单。
进入细节:如果没有关于您的应用程序架构的更多信息,就不可能评估这种或那种方法的优点,但这里有一些一般性建议:
refundOrder
.确保订单已成功加载;确保您要操作的订单都是可退款的(尝试退款由于业务逻辑而无法退款的订单的目的是什么?在尝试退款之前不应该通知用户/运算符(operator)吗?) . try
/catch
,但也许不是全部在里面 refundOrder
.外部块旨在捕获任何真正出乎意料的错误,因此在 refundOrder
中捕获它们有什么意义?只要?您不想在应用程序的其他部分也这样做吗?最里面try
/catch
是必要的,以便一个不可退款的订单不会终止所有过程。 关于php - catch 语句中函数的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10209456/