PHP CodeIgniter错误未停止执行Try块

PHP CodeIgniter错误未停止执行Try块,php,codeigniter,error-handling,Php,Codeigniter,Error Handling,我正在使用CodeIgniter,并试图在try/catch块中执行代码,其思想是错误会在错误发生后停止代码的执行,直到到达catch块为止,正如您通常认为的那样 然而,当遇到PHP错误时,代码仍在继续。这将导致执行数据库事务完成命令,该命令为。。。。如果出现错误,并且没有正确执行所有说明,则情况非常糟糕。例如,我在ajax请求中执行了以下代码: // start transaction $this->db->trans_start(); try { $this-&

我正在使用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 );
}    

假设您使用的是PHP7.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
}

请注意,如果您仍然只使用PHP5.x,那么上面的方法将不起作用;在较旧的PHP版本中无法捕获PHP错误。

只有在引发异常而不是错误时才会执行catch块。try块中的任何函数是否设置为在出错时引发异常?如果您从
M_debug
类中的
fblog()
方法发布代码,我可以尝试并帮助您。感谢您的回复。我按要求发布了fblog(),非常简单。所以,如果我理解了,我需要在出错时手动抛出异常。但是如何检测错误以抛出异常呢?我喜欢在try块中运行所有事务的想法,因为您不知道什么会导致错误。也许您也应该在try块中启动事务?不确定你是否解决了问题,但只是一个想法。谢谢你的回复。我尝试将异常$ex更改为Throwable$ex,但没有效果,代码仍在执行,没有捕获任何内容。我还是做错了什么吗?谢谢你没有说你会犯什么样的错误;这可能会有帮助。