【问题标题】:Will the code in finally be run if I have program flow like this?如果我有这样的程序流程,最终会运行代码吗?
【发布时间】:2014-08-08 23:03:37
【问题描述】:

我想知道下面的程序流程是否会因为 try 中的返回而阻止 finally 在这个 try-catch-finally 块中运行。

请原谅糟糕的错误检查和清理,这只是一个模拟:

function doLogin() {

    $dbh = new PDO('mysql:host=localhost;dbname=test', "root", "");
    $errors = array();
    $loginSuccess = false;

    try {
        $query = $dbh->prepare('SELECT *
                                FROM users
                                WHERE username = :username');
        $query->bindParam(':username', $_POST['username'], PDO::PARAM_STR);
        $result = $query->fetch(PDO::FETCH_ASSOC);
        if (!password_verify($_POST['password'], $result['password'])) {
            array_push($errors, 'Invalid password.');
            return; // will this return prevent the finally from being run?
        }
        else {
            $loginSuccess = true;
        }
    }
    catch (PDOException $pdoEx) {
        echo 'Error occurred ' . $pdoEx->getMessage();
    }
    finally {
        $dbh = null;
    }

}

代码写得很糟糕,但希望你能理解我的意思。

【问题讨论】:

  • 为什么不写一个快速的示例程序来测试它呢?
  • @VinceEmigh - 这个问题是关于 Javascript 的。尽管 PHP 和 Javascript 有一些相似之处,但它们绝对不是同一种语言,并且处理方式可能不同。
  • @Mr.Llama 我会去做的,只是想快速进入并询问 SO,以防万一这是非常基本的程序流程知识。

标签: php


【解决方案1】:

答案是肯定的,finally中的代码会运行。

例如:

function example() {
    try {
        return true;
    }
    catch(Exception $e){
        echo "error";    
    }
    finally{
        return false;
    }
}
var_dump( example() );

输出:

bool(false)

文档中也(隐藏地)说明了这一点:

在 PHP 5.5 及更高版本中,finally 块也可以在 抓块。 finally 块中的代码将始终被执行 在 try 和 catch 块之后,无论是否有异常 被抛出,并且在正常执行之前恢复。

据我了解,try 块以 return 语句结束。 正常执行被“暂停”并最终执行。

【讨论】:

  • 谢谢,是的,我自己做了一个快速测试(我应该从一开始就做)here.
猜你喜欢
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多