【问题标题】:Simple try/finally vs. try/catch简单的 try/finally 与 try/catch
【发布时间】:2019-02-28 05:55:38
【问题描述】:

用一个简单的函数如:

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 的兼容性?

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 您好,是“如果您在 finally 语句中放入 return,那么它将始终在 try 完成后运行。”鉴于try{} 块中有return 是否有效?我做了一些测试,证明你的说法不成立。至于与$var的出身混淆;它在函数声明中作为必需参数提供。
    • 是的,它是有效的
    • 很抱歉,我很难将您所写的内容应用到我所要求的内容中。您能否展示一个执行路径的示例,它会产生不同的结果,其中 finally{}catch(){} 是唯一的区别?
    • 当然,给我几个小时 :-) (现在AFK)
    • 没问题,请注意 try 和 finally/catch 块中的 return $var;
    猜你喜欢
    • 2014-11-27
    • 2011-02-20
    • 1970-01-01
    • 2011-11-17
    • 2011-10-31
    • 2014-04-27
    • 2011-10-26
    • 1970-01-01
    • 2018-10-24
    相关资源
    最近更新 更多