PHP finally子句

ran*_*tsh 3 php exception-handling

模拟finally子句的最佳实践是什么?我知道这可能被认为相关(虽然我不认为这是一个副本)这个问题.

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

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

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

Rob*_*vey 7

最终添加到PHPRFC中,他们建议使用此解决方法:

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

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


IMS*_*SoP 5

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

我们的想法是,如果异常使您退出函数范围,您的析构函数将会触发,因此您的清理将按预期进行.如果没有抛出异常,您将到达函数的末尾,并且您的变量将超出范围.

一个快速的谷歌出现了这个简单的代码,用于执行任意回调.