【发布时间】:2018-10-23 12:55:46
【问题描述】:
我正在使用 CodeIgniter 并尝试在 try/catch 块中执行代码,其想法是错误将在错误之后停止执行代码,直到到达 catch 块,因为您通常认为它会起作用。
但是在遇到 PHP 错误时,代码仍在继续。这会导致执行数据库事务完成命令,如果出现错误并且所有指令均未正确执行,则非常糟糕。例如,我有这个在 ajax 请求中执行的代码:
// start transaction
$this->db->trans_start();
try {
$this->M_debug->fblog("firstName=" . $triggerOpts->{'firstXXXName'});
$data = array("test_col" => 123);
$this->db->where("id", 4);
$this->db->update("my_table", $data);
// if got this far, process is ok
$status = "process_ok";
// complete transaction
$this->db->trans_complete();
} catch (Exception $ex) {
// output the error
$this->M_debug->logError($ex);
}
在此代码中,我尝试将数据库更新作为事务的一部分执行。
我对$this->M_debug->fblog() 的调用旨在将一个变量记录到PHP 控制台,我故意尝试记录一个不存在的变量。
这会导致一个PHP错误,我猜这是一个致命错误,想要的结果是日志命令之后的代码失败,事务没有完成。但是在这个错误之后,尽管在 Chrome 控制台中报告了 PHP 错误,但代码继续执行,数据库更新并且事务完成。对于如何阻止这种情况发生的任何帮助,我将不胜感激。
非常感谢,G
编辑——
按照 fblog() 的请求,它只是一个变量的 Chrome 控制台日志请求
public function fblog( $var ) {
ChromePhp::log( $var );
}
【问题讨论】:
-
只有在抛出异常而不是错误时才会执行catch块。 try 块中的任何函数是否设置为在出错时抛出异常?
-
如果您将代码从
fblog()方法中的M_debug类中发布,我可以尝试帮助您。 -
感谢您的回复亚当。我按要求发布了 fblog(),它非常简单。因此,如果我了解我需要在错误时手动抛出异常。但是我如何检测错误以引发异常?我喜欢在 try 块中运行所有内容的想法,因为您不知道会导致错误的原因。
-
也许您也应该在 try 块中启动事务?不确定您是否已经解决了您的问题,但只是一个想法。
标签: php codeigniter error-handling