模拟finally子句的最佳做法是什么?我意识到这可以被认为与this question有关(虽然我不认为它是重复的)。
但是,在我的情况下,我想处理异常,我想最终使用(或任何PHP等价或实践)python定义:
在离开try语句之前总是执行finally子句,无论是否发生了异常。
在try-catch块之后松散地编写代码对我来说似乎是一种丑陋的做法。
答案 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.
};
}