为了账号安全,请及时绑定邮箱和手机立即绑定

在PHP中使用try-catch如何在不抛出异常的情况下进入finally?

在PHP中使用try-catch如何在不抛出异常的情况下进入finally?

PHP
暮色呼如 2021-10-08 13:13:14
关于下面的代码,我怎样才能在 PHP 中不抛出异常的情况下进入finally?try {  $db = DataSource::getConnection();  if (some condition here is TRUE) {      // go to finally without throw an exception   }  $stmt = $db->prepare($sql);  $stmt->saveMyData();} catch (Exception $e) {  die($e->getMessage());} finally {  $db = null;}
查看完整描述

1 回答

?
喵喵时光机

TA贡献1846条经验 获得超7个赞

请不要这样做,但这里有一个选项:


try {

    if (TRUE){

        goto ugh;

    }

    echo "\ndid not break";

    ugh:

} catch (Exception $e){

    echo "\ndid catch";

} finally {

    echo "\ni'm so tired";

}

我强烈建议不要使用goto. 我认为如果您使用goto.


我建议:


try {

    if (TRUE){

        echo "\nThat's better";

    } else {

       echo "\ndid not break";

    }

} catch (Exception $e){

    echo "\ndid catch";

} finally {

    echo "\ni'm so tired";

}

您只需将其余部分包装try成 anelse即可跳过它。


另一种选择是声明一个 finally 函数,调用它,然后返回。


//I'm declaring as a variable, as to not clutter the declared methods

//If you had one method across scripts, naming it `function doFinally(){}` could work well

$doFinally = function(){};

try {

    if (TRUE){

        $doFinally();

        return;

    }

    echo "\ndid not break";

} catch (Exception $e){

    echo "\ndid catch";

} finally {

    $doFinally();

}

如果您需要继续脚本,您可以声明$doFinally如下内容:


$doFinally = function($reset=FALSE){

    static $count;

    if ($reset===TRUE){

        $count = 0;

        return;

    } else if ($count===NULL)$count = 0;

    else if ($count>0)return;

}


然后在finally块之后,您可以调用$doFinally(TRUE)以将其重置为下一个try/catch


查看完整回答
反对 回复 2021-10-08
  • 1 回答
  • 0 关注
  • 211 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信