在PHP中使用try-catch如何转到finally而不引发异常?

在PHP中使用try-catch如何转到finally而不引发异常?,php,Php,关于下面的代码,我怎样才能在不抛出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 $

关于下面的代码,我怎样才能在不抛出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;
}

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

试试看{
如果(真){
去吧;
}
回显“\nID未中断”;
呃:
}捕获(例外$e){
回显“\nID捕捉”;
}最后{
回声“\n我太累了”;
}
我强烈建议不要使用
goto
。我认为,如果使用
goto
,代码很容易变得草率和混乱

我建议:

试试看{
如果(真){
回声“\n这更好”;
}否则{
回显“\nID未中断”;
}
}捕获(例外$e){
回显“\nID捕捉”;
}最后{
回声“\n我太累了”;
}
您只需将
try
的其余部分包装成
else
即可跳过它


另一种选择是声明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=函数($reset=FALSE){
静态$计数;
如果($reset==TRUE){
$count=0;
回来
}如果($count==NULL)$count=0,则为else;
否则如果($count>0)返回;
}

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

在您的示例中,不需要finally。你有什么问题?你为什么要这么做?谢谢!很多年前我在Clipper中使用过这个“goto”,我不知道PHP中是否存在“goto”!我这样问是因为我对“try”进行了一些检查,尽管出现了一些可以抛出的错误,但有时我需要“return”而不是“throw Exception”,而是在“return”之前执行“finally”中存在的内容。让我们使用一个简单的例子,假设将连接关闭到“finally”。在“try”中进入一个条件,当不满足时,我需要“return”和“close the connection”,它存在于“finally”中。如何不复制此代码?我认为没有办法,我们需要使用一些方法,或者重复代码。@RodrigoGuariento,更新了答案。声明一个新函数可能是一个好办法。