我知道什么是例外,我知道何时使用它们但是今天我从这篇博客中读到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()
有效地关闭数据库事务。
根据这一观察结果,最终数据永远不应成为交易的一部分,如作者所说。
答案 0 :(得分:1)
commit指令在函数foo()
中是最后一个。如果引发异常(只能在函数内部发生,因为try-catch块只包含对该函数的调用),那么显然,该函数代码不处理到最后。因此,不执行任何提交,事务“挂起”。
执行继续执行catch块(它是空的,因此异常被“吞下”)然后在catch块之后正常运行并执行“final data”指令。因此,函数中的commit指令是从不执行,事务仍然接受语句。这就是为什么“最终数据”成为该交易的一部分。
在捕获到异常后,执行不会以某种方式跳回!这是异常的全部要点:立即离开失败的代码并返回调用/控制范围。