简单尝试/最终与尝试/捕获

时间:2018-09-24 16:58:59

标签: php try-catch php-5.3 php-5.5

具有简单的功能,例如:

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中100%兼容,因为finally{}是在5.5中引入的,我希望在保持100%的逻辑的同时进行必要的最小更改。

我之所以只问是因为我个人对使用try / catch / finally块的经验很少,而且我并不了解所有陷阱。

是否有更好的方法来实现PHP 5.3兼容性?

1 个答案:

答案 0 :(得分:4)

如果将return放在finally语句中,则它将始终在尝试完成后运行。您的第一个示例(可能已减少)将使用finally子句而非try子句返回的结果。

您的第二个示例有些不同,因为尚不清楚如何定义$var。如果您有$var = $this->throwsException('x');并且该行是引发异常的地方,那么$var将在catch子句中未定义。如果已经定义了$var,则假定try子句引发异常,那么catch子句将是您从那里返回的地方。

如果您需要一个finally子句的PHP 5.3安全版本,我会这样做:

$var = false;
try {
    $var = $this->doSomething();
} catch (Exception $ex) {
    $var = $ex->getMessage();
}
return $var;