Ajax 当发生未处理的异常时,让CakePHP返回50x HTTP响应

Ajax 当发生未处理的异常时,让CakePHP返回50x HTTP响应,ajax,http,cakephp,Ajax,Http,Cakephp,我正在编写一个CakePHP-CakePHP.org控制器。其中一个动作myAction响应AJAX请求。我发现,如果操作处理程序中出现任何错误,Cake总是以错误页面和200的HTTP状态响应,这意味着它会以静默方式失败,因此我必须打开一个新窗口,直接从地址栏运行AJAX请求,以查看输出并找出错误。作为一个例子,假设我写了下面的操作,它会产生一个被零除的错误 function myAction() { 0/0; // produce a divide-by-0 error for the

我正在编写一个CakePHP-CakePHP.org控制器。其中一个动作myAction响应AJAX请求。我发现,如果操作处理程序中出现任何错误,Cake总是以错误页面和200的HTTP状态响应,这意味着它会以静默方式失败,因此我必须打开一个新窗口,直接从地址栏运行AJAX请求,以查看输出并找出错误。作为一个例子,假设我写了下面的操作,它会产生一个被零除的错误

function myAction() {
  0/0;  // produce a divide-by-0 error for the sake of example
}
Cake返回一个错误页面作为其HTTP状态代码为200的响应。换句话说,Cake告诉我它返回了一个成功的错误页面

我尝试在除以零之前添加以下两行:

define('DISABLE_DEFAULT_ERROR_HANDLING', true);
set_error_handler('myError', E_ALL);
0/0;
然后在全局命名空间中:

  function myError($code, $msg) {
    CakeLog::write('error', "code=$code: $msg");
    header('HTTP/1.0 500 Internal Error');
    die($code);
  }
在这种情况下,CakePhp从不发送响应。对于浏览器,响应将永远挂起

为了比较,我编写了一个简单的独立PHP,没有蛋糕页面:

<?php
function myHandler($errrno, $msg) {
  header('HTTP/1.0 500 Internal Error');
  die($msg);
}

set_error_handler(myHandler, E_ALL);
0/0;
die('got here');
?>
它的输出是

除零

正如所料

我知道,必须有更好的方法来配置CakePHP自动处理控制器/操作处理程序中的错误,而不需要大量代码

和上的优秀帖子有助于让我知道我走上了正确的道路,但它们仍然不能满足我的愿望,即当发生意外异常时,让Cake返回50倍的HTTP响应。然后,当响应返回时,浏览器可以在页面上显示一条消息,如“发生错误”,通知网站管理员,我将知道如何查看Apache错误日志以了解真正发生的情况


欢迎所有想法。

Cake总是以错误页面和HTTP状态200响应-这仅在启用调试时发生


为什么要拥有自己的错误处理程序,您可以轻松创建AppError并干净地扩展cakes处理程序

像这样做

try{
    devideByZero(); // throws an error
}
catch(Exeption $e){
    $this->cakeError('yourCustom5xxError');
}

为什么要拥有自己的错误处理程序,因为AppError似乎总是返回HTTP状态200,即使请求失败也是如此。对于显示在浏览器窗口中的响应,这可能没问题,但对于AJAX调用则不行。如果出现问题,我希望它返回一个状态代码,告诉处理程序出了问题,比如50x。AJAX请求总是返回200并将实际状态放入其响应中,如{status:fooey!,reason:dunno,…},这是一种惯例吗。如果是这样,我想知道更多。所以覆盖错误,使其不返回200。您可以使用RequesHandler检查ajax,并使其返回您想要的结果