PHP finally子句

时间:2013-03-12 19:28:54

标签: php exception-handling

模拟finally子句的最佳做法是什么?我意识到这可以被认为与this question有关(虽然我不认为它是重复的)。

但是,在我的情况下,我想处理异常,我想最终使用(或任何PHP等价或实践)python定义:

  

在离开try语句之前总是执行finally子句,无论是否发生了异常。

在try-catch块之后松散地编写代码对我来说似乎是一种丑陋的做法。

4 个答案:

答案 0 :(得分:7)

RFC for adding finally to PHP中,他们建议使用此解决方法:

<?php
$db = mysqli_connect();
try {
   call_some_function($db);
} catch (Exception $e) {
   mysqli_close($db);
   throw $e;
}
mysql_close($db);

因此,除非您升级到PHP 5.5(包含finally构造),否则这可能是您的最佳选择。

答案 1 :(得分:5)

这可以被认为是一种非答案,但是有一些方法可以构造代表不需要finally的代码,例如“RAII模式”(“资源获取是初始化”),其中清理资源在表示该资源的本地范围变量的析构函数中完成。

这个想法是,如果一个异常使你脱离了函数范围,你的析构函数将会触发,所以你的清理会按预期发生。如果没有抛出任何异常,您将到达函数的末尾,并且您的变量将超出范围。

快速Google出现this simple code for doing it with arbitrary callbacks

答案 2 :(得分:2)

PHP 5.5及更高版本确实具有finally构造。

来自文档:

try {
    echo inverse(5) . "\n";
} catch (Exception $e) {
    echo 'Caught exception: ',  $e->getMessage(), "\n";
} finally {
    echo "First finally.\n";
}

答案 3 :(得分:0)

如果你仍然坚持维护5.5之前的遗留代码,并且你不记得每次通话强制性假冒的开销,总会有这个肮脏的小技巧。

try { 
     // do your worst to mess things up.

     throw new Exception("finally");
} catch (Exception $e) {
    //TODO: after upgrading to 5.5, make this a legit try/catch/finally
    if ( ($msg = $e->getMessage())  != "finally"){
        // real catch
        echo "Exception doing something :" . $msg;
    } else {
        // quasi finally.
    };
}