在用ThinkPHP5.*框架开发中,曾经遇到过在try-catch内提交事务之后总是抛出异常的情况,代码如下:1
2
3
4
5
6
7
8
9
10
11
12
13Db::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的源代码,以减少各种因为不熟悉出现的坑。