简单的try/finally和try/catch

4

使用简单的函数:

function hello( $var )
{
    try
    {
        // do something with $var which may or may not throw an exception
        return $var;
    }
    finally
    {
        return $var;
    }
}

如果将其转换为以下内容,逻辑或处理上是否有任何差异:

function hello( $var )
{
    try
    {
        // do something with $var which may or may not throw an exception
        return $var;
    }
    catch( Exception $e )
    {
        return $var;
    }
}

请忽略对$e未做任何操作的事实,以及样例函数的简单/无用性;这只是一个MCVE
此次转换的目的是使源代码在PHP 5.3中完全兼容,因为finally{}是在5.5中引入的,我希望尽可能少地进行更改,同时保持100%的逻辑。
我之所以提出这个问题,是因为我个人使用try/catch/finally块的经验很少,也不知道所有的陷阱。
是否有更好的方法实现PHP 5.3兼容性?
1个回答

4
如果你在finally语句中添加一个return,那么它将始终在try完成后运行。你的第一个例子(可能被削减了)将使用从finally子句返回的结果,而不是try子句的结果。
你的第二个例子有点不同,因为不清楚你如何定义$var。如果你这样定义$var=$this->throwsException('x');并且该行是抛出异常的位置,那么在catch子句中$var将未定义。如果$var已经定义,则假定try子句抛出异常,catch子句将是你返回的地方。
如果你需要一个PHP 5.3安全版本的finally子句,我会这样做:
$var = false;
try {
    $var = $this->doSomething();
} catch (Exception $ex) {
    $var = $ex->getMessage();
}
return $var;

你好,如果在finally语句中放置了一个return语句,那么它是否总是在try完成后运行是正确的吗?考虑到try{}块中有一个return,我已经进行了一些测试来证明你的说法是错误的。至于关于$var来源的混淆,它在函数声明中作为必需参数提供。 - MonkeyZeus
是的,它是有效的。 - scrowler
非常抱歉,我很难将您所写的内容应用到我的问题上。您能否展示一个执行路径的例子,其中finally{}catch(){}是唯一的区别,但会产生不同的结果? - MonkeyZeus
当然,给我几个小时 :-) (现在离开了) - scrowler
没问题,请注意在try和finally/catch块中都要使用return $var; - MonkeyZeus
最终块比try块更优先执行: https://eval.in/1059438,最终块比catch块更优先执行: https://eval.in/1059439,捕获异常: https://eval.in/1059440 - 希望这可以帮到你。如果仍不清楚,我明天可以写更多的例子。 - scrowler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接