没有捕获PHP异常

时间:2018-07-10 14:03:35

标签: php

我正在尝试创建一个错误处理程序以将我的ajax请求的错误转换为JSON。 我有一个处理所有MySql查询的数据库类,并在发生错误时调用以下函数:

private function halt($msg)
{
    $this->Error = @mysqli_error($this->Link_ID);
    $this->Errno = @mysqli_errno($this->Link_ID);

    if ($this->throw = true) {
        throw new \Exception("Mysql Error: $msg. Error: $this->Errno ($this->Error)");
    } else if ($this->Halt_On_Error == "no") {
        return;
    }

    $this->haltmsg($msg);

    if ($this->Halt_On_Error != "report") {
        die("Session halted.");
    }
}

在我的ajax脚本中,我有一些像这样的功能:

private function add()
{
    $this->changeErrorCatcher(ON);
    try {
        $obj = $this->mgr->getEmptyObject();
        foreach ($this->fields as $field) {
            if (!$this->form->vide($field) && $field != "id") {
                $name = "set" . ucfirst($field);
                $obj->$name($this->form->get($field));
            }
        }
        $this->mgr->create($obj);
        Ajax::Response(AJX_ACC, "Ok", $obj->getId());
    } catch (\Throwable $e) {
        Ajax::Response(AJX_ERR, $e->getMessage(), $e);
    }
}

changeErrorCatcher函数:

private function changeErrorCatcher(bool $onOff)
{
    if ($onOff) {
        set_error_handler(function ($errno, $errstr) {
            throw new \Exception($errstr, $errno);
        }, E_ALL | E_ERROR | E_STRICT | E_USER_ERROR);
    } else {
        restore_error_handler();
    }
}

我的问题是add()函数中的try / catch块不起作用:“ $ this-> mgr-> create($ obj);”行调用我的数据库类,因此,当发生错误并引发Exception时会调用halt()函数,但是catch块永远不会启动,并且Exception的文本会作为ajax结果发送(使我的JS无法解析JSON)

我已经尝试过提出here的解决方案,但是没有任何效果(用\ Exceptions代替Exception(即使\ Throwable也不起作用),禁用XDEBUG,更改错误处理程序)

编辑:我尝试更改暂停功能:

if ($this->throw = true) {
    throw new \Exception("Mysql Error: $msg. Error: $this->Errno ($this->Error)");
} 

进入:

if ($this->throw = true) {
        try {
            throw new \Exception("Mysql Error: $msg. Error: $this->Errno ($this->Error)");
        } catch (\Exception $e) {
            throw new \Exception("Mysql Error: $msg. Error: $this->Errno ($this->Error)  ".$e->getTraceAsString());
        }
    }

现在,我已经在ajax结果中获得了堆栈跟踪,因此可以很好地捕获第一个异常,但是第二个则不能。 堆栈跟踪向我显示它是“ $ this-> mgr-> create($ obj);”行。会引发异常。

1 个答案:

答案 0 :(得分:0)

您的代码失败,因为mysqli返回错误而不是异常。在运行任何查询之前,请在连接构造函数中设置以下内容,以告诉它引发异常而不是错误,并且代码应能正常工作:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

当查询返回重复的id错误时,您可能还考虑更新SQL语句以使用INSERT IGNOREON DUPLICATE KEY UPDATE ...来在数据层级别处理错误。