try-catch-finally和return的执行顺序

        情况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)


冷暖自知一抹茶ck
请先登录后发表评论
  • 最新评论
  • 总共0条评论