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;
        }
    }