【发布时间】:2012-04-18 12:34:02
【问题描述】:
这是一段我想知道是否应该对其进行重构以使其更符合清洁代码实践的代码。
这是一个负责退还客户订单的类。
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 构建的。
提前致谢。
【问题讨论】:
-
$this->logError()真的会抛出异常吗?似乎这可能不是最佳实践,您可能很容易陷入无限循环。您真正需要做的是决定如果错误记录/管理电子邮件发送失败,您希望您的应用程序做什么。如果您只是忽略错误并继续,请不要从这些方法中抛出任何异常。如果您想因堆栈跟踪而死,请不要捕获异常。如果您想了解如何处理这种情况,请使用内部 try/catch。恕我直言... -
基本上是的,或者在上面代码的
catch块内-try { throw new Exception(); } catch (Exception $e) { try { handle_exception($e); } catch (Exception $e2) { } }
标签: php oop zend-framework error-handling dry