houqin2869 2019-05-23 02:11 采纳率: 0%
浏览 194

PHP mvc结构中如何处理异常?

在使用YII2事务操作中,突然纠结异常的处理方式,看到项目中用到的三种方式:

1:业务逻辑层只负责抛出异常,不进行处理,在C层统一捕获并处理后返回

2:业务逻辑层负责处理异常并加工后再次抛出,C层在进行捕获并返回

3:所有的错误直接返回false(个人感觉无法快速定位问题并且也不友好)

以下是我现有的处理逻辑,感觉有点啰嗦,请多指点

控制器层

  public function actionSend()
    {
        $pk_id = \Yii::$app->request->post('merchant_id');
        try {
            (new Merchant())->send($pk_id);
            return $this->outSuccess();
        } catch (\Exception $e) {
            return $this->outError($e->getMessage());
        }
    }

业务逻辑层

 public function send($pk_id)
    {
        $idsArray = is_array($pk_id) ? $pk_id : [$pk_id];
        $tran = \Yii::$app->db->beginTransaction();
        try {
            foreach ($idsArray as $id) {
                $item = SpiderMerchantModel::findOne($id)->attributes;
                if (!$item["category_id"]) {
                    throw new Exception('请完整所选项目的分类');
                }
                $merchantModel = new MerchantModel();
                if ($merchantModel->load($item, '') && $merchantModel->save()) {
                    $tran->commit();
                } else {
                    throw new Exception('保存失败');
                }
            }
        } catch (\Exception $e) {
            $tran->rollBack();
            throw $e;
        }
    }
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-09 18:40
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    在PHP MVC架构中,异常处理通常涉及到以下几个方面:

    1. 错误日志记录:将异常信息记录到日志文件中。
    2. 异常处理:对于不同的异常类型,可以采取不同的处理策略。例如,一些异常可能需要进一步的检查和处理,而其他类型的异常则可以直接被忽略或跳过。

    在你的例子中,你已经定义了两种常见的异常处理方法:一种是在业务逻辑层抛出异常,另一种是在控制器层捕捉并返回异常。

    关于第三种方法,即所有的错误都直接返回False,这并不是一个好习惯。因为这样做可能会导致客户端程序在处理这些错误时陷入无限循环或者无法正常响应。此外,如果错误是由于服务器端的问题而不是客户端的问题造成的,那么直接返回False可能不会提供任何帮助。

    下面是一个简单的示例,展示了如何处理异常,并且如何在不同的层次之间传递错误信息:

    <?php
    namespace app\controllers;
    
    class MerchantController extends Controller
    {
        public function beforeAction($action)
        {
            // 在这里添加任何必要的初始化工作
            return true; // 或者继续执行控制器的动作
        }
    
        public function actionSend()
        {
            try {
                (new Merchant())->send(...);
                return $this->outSuccess(); // 返回成功消息
            } catch (\Exception $e) {
                return $this->outError($e->getMessage()); // 返回错误消息
            }
        }
    }
    
    // 商户模型类
    class MerchantModel
    {
        private $model;
    
        public function __construct($model)
        {
            $this->model = $model;
        }
    
        public function save()
        {
            // 这里是数据库操作,如果发生错误,则抛出异常
            if (!$this->model->save()) {
                throw new Exception('保存失败');
            }
        }
    }
    

    在这个例子中,我们首先在beforeAction方法中做了初始化工作。然后,在actionSend方法中,我们在尝试执行业务逻辑之前先进行了异常处理。如果发生了异常,我们就直接返回错误消息。

    这样做的好处是可以让开发者更容易地追踪错误来源,同时也可以避免不必要的错误处理。

    评论

报告相同问题?