php - catch 语句中函数的错误处理

标签 php oop zend-framework error-handling dry

这是一段代码,我想知道是否应该对其进行重构以使其更符合 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/

    相关文章:

    php - 从 SQL 数据库中选择随机行并存储以供在另一个页面上重复使用

    oop - DDD : Where to put persistence logic, 以及何时使用 ORM 映射

    oop - MATLAB 面向对象 : How do I call a method on an object of class A from inside a method in an object of class B?

    php - Zend Framework正常查询Zend_Db_Table

    php - 将 JSON 解析为 MySQL 表

    php - Zend_Validate : Db_NoRecordExists with Doctrine

    php - 我如何解析此 json 以返回委员会名称

    php - 在 PHP 中将单值数组转换为变量的快速方法?

    php - Symfony2 Form 使用 attr 属性的翻译器

    java - 重写 ArrayList 类 - Java