关于在thinkphp5中try catch提交事务一直抛出异常的问题

在用ThinkPHP5.*框架开发中,曾经遇到过在try-catch内提交事务之后总是抛出异常的情况,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
Db::startTrans();
try{

$user = User::where('username',$name)->find();
$user->nickname = 'new-nickname';
$user->save();

Db::commit();
return $this->success('更新成功');
}catch (\Exception $exception){
Db::rollback();
return $this->error('更新成功');
}

以上代码如果在catch内加个var_dump(1),就会发现始终会输出1。原因在于$this->success()方法是有问题的,我们点开可以看到,success方法最后执行的代码是:

1
throw new HttpResponseException($response);

HttpResponseException继承了\RuntimeException异常类,所以不管你怎么success其实都是抛出了异常。虽然TP有些地方的高度封装给我们带来了便利,但是对不熟悉框架的人来说有些可能就是坑。有兴趣的可以了解一下TP的架构和通读一遍TP的源代码,以减少各种因为不熟悉出现的坑。