最近在写一个laravel中间件的时候,因为里面有好几层异常的处理,感觉代码不太简洁,于是想到了finally,按照字面理解,finally是最后执行的,原以为是用来处理异常的,后来发现不管有没有异常,都会走到finally的那段代码,包括前面有return,也会走到finally代码段,后来查了一下资料,finally执行流程如图:
特别要注意的是
1,如果catch里面有return或者try里面有return,finally里面没有return,最后会return前面的第一个return,非finally代码段的return后面的代码是不执行的,finally代码段肯定会执行。
2,如果catch里面有return或者try里面有return,finally里面有return,非finally代码段的return后面的代码是不执行的,但是finally里面的return会覆盖前面return的值
代码为证:
public function testReturn()
{
try {
return 1;
echo 'bbb';
} finally {
echo 'aaa';
return 2;
}
}
public function handle()
{
$test = $this->testReturn();
var_dump($test);exit;
}
输出:
aaa
int(2)
public function testReturn()
{
try {
return 1;
echo 'bbb';
} finally {
echo 'aaa';
}
}
public function handle()
{
$test = $this->testReturn();
var_dump($test);exit;
}
输出:
aaa
int(1)
总结:
finally之前的代码,该怎么执行怎么执行,但是前面的代码执行结束了,肯定会走到finally里面,而且如果fanally有return会覆盖return值,没有return,就不会覆盖,依旧返回前面的return值