情况1:
try{} catch(){}finally{} return;
程序按顺序执行。
情况2:
try{ return; }catch(){} finally{} return;
程序执行try块中return之前(包括return语句中的表达式运算)代码; 再执行finally块,最后执行try中return; finally块之后的语句return,因为程序在try中已经return所以不再执行。
情况3:
try{ } catch(){return;} finally{} return;
程序先执行try,如果遇到异常执行catch块, 有异常:则执行catch中return之前(包括return语句中的表达式运算)代码,再执行finally语句中全部代码, 最后执行catch块中return. finally之后也就是4处的代码不再执行。 无异常:执行完try再finally再return.
情况4:
try{ return; }catch(){} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码; 再执行finally块,因为finally块中有return所以提前退出。
情况5:
try{} catch(){return;}finally{return;}
程序执行catch块中return之前(包括return语句中的表达式运算)代码; 再执行finally块,因为finally块中有return所以提前退出。
情况6:
try{ return;}catch(){return;} finally{return;}
程序执行try块中return之前(包括return语句中的表达式运算)代码; 有异常:执行catch块中return之前(包括return语句中的表达式运算)代码; 则再执行finally块,因为finally块中有return所以提前退出。 无异常:则再执行finally块,因为finally块中有return所以提前退出。
最终结论:任何执行try 或者catch中的return语句之前,都会先执行finally语句,如果finally存在的话。 如果finally中有return语句,那么程序就return了,所以finally中的return是一定会被return的
function aaa()
{
try {
var_dump(1111);
throw new Exception('操作频繁,请稍后再试', -1);
var_dump(2222);
return json(3333);
}catch (\Throwable $th) {
var_dump(4444);
return json(5555);
}finally{
var_dump(6666);
}
}
function json($a){
var_dump($a);
// exit; 打断后,不会再执行 finally
}
aaa();
//输出结果:
int(1111)
int(4444)
int(5555)
int(6666)本文为崔凯原创文章,转载无需和我联系,但请注明来自冷暖自知一抹茶ckhttp://www.cksite.cn