【问题标题】:PHP CodeIgniter Errors not stopping execution of Try BlocksPHP CodeIgniter 错误不会停止执行 Try 块
【发布时间】: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


【解决方案1】:

假设您使用的是 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 错误。

【讨论】:

  • 感谢您的回复。我尝试将 Exception $ex 更改为 Throwable $ex ,但没有任何效果,代码仍在执行,没有任何内容被捕获。我还在做错什么吗?谢谢
  • 你并没有真正说出你得到什么样的错误;这可能会有所帮助。
猜你喜欢
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
  • 2015-07-15
  • 2015-06-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-19
相关资源
最近更新 更多