在使用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;
}
}