PHP 代码点火器错误未停止 Try 块的执行



我正在使用 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 错误。

相关内容

  • 没有找到相关文章

最新更新