PHP,异常如何真正起作用?

时间:2017-04-29 06:14:05

标签: php exception transactions

我知道什么是例外,我知道何时使用它们但是今天我从这篇博客中读到Destructing PHP。它有以下代码

require('autoload.php');

function foo($db, $data) {
    $db->beginTransaction();

    foreach ($data as $row) {
        $db->insert($row);
    }

    $db->commit();
}

$db = db::factory();
$data = data::factory();

try {
    foo($db, $data);
} catch (Exception $e) {}

$db->insert(data::finalData());
  

根据程序,data :: finalData()应该独立于foo()是否成功存储。不幸的是情况并非如此:如果foo()内部循环中的某些内容抛出,则会有一个打开的事务。最终数据现在成为该交易的一部分。由于没有进一步处理,PHP将在此程序结束时进行清理并自动回退事务。

令人困惑的部分是The final data now becomes part of that transaction。 这与我对异常的理解相冲突,我知道从被捕获时调用throw的地方开始执行的异常,在这种情况下,在foreach中的某个地方并继续执行foo函数$db->commit()有效地关闭数据库事务。 根据这一观察结果,最终数据永远不应成为交易的一部分,如作者所说。

1 个答案:

答案 0 :(得分:1)

commit指令在函数foo()中是最后一个。如果引发异常(只能在函数内部发生,因为try-catch块只包含对该函数的调用),那么显然,该函数代码处理到最后。因此,不执行任何提交,事务“挂起”。

执行继续执行catch块(它是空的,因此异常被“吞下”)然后在catch块之后正常运行并执行“final data”指令。因此,函数中的commit指令是从不执行,事务仍然接受语句。这就是为什么“最终数据”成为该交易的一部分。

在捕获到异常后,执行不会以某种方式跳回!这是异常的全部要点:立即离开失败的代码并返回调用/控制范围。

相关问题