我正在使用 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 );
}
假设您使用的是 PHP 7.0 或更高版本,您可以捕获 PHP 错误和异常,但是您需要捕获Error
或父Throwable
类型而不是Exception
。
try {
...
} catch (Throwable $ex) {
//this will catch anything, including Errors and Exceptions
}
或者,如果你想对它们每个人做一些不同的事情,可以单独抓住它们......
try {
...
} catch (Exception $ex) {
//this will catch Exceptions but not errors.
} catch (Error $ex) {
//this will Errors only
}
请注意,如果您仍然只是 PHP 5.x,则上述方法将不起作用;您无法在较旧的 PHP 版本中捕获 PHP 错误。