我正在尝试创建一个错误处理程序以将我的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);”行。会引发异常。
答案 0 :(得分:0)
您的代码失败,因为mysqli返回错误而不是异常。在运行任何查询之前,请在连接构造函数中设置以下内容,以告诉它引发异常而不是错误,并且代码应能正常工作:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
当查询返回重复的id错误时,您可能还考虑更新SQL语句以使用INSERT IGNORE
或ON DUPLICATE KEY UPDATE ...
来在数据层级别处理错误。