Я пишу контроллер CakePHP (cakephp.org). Одно из действий, «myAction», отвечает на запросы AJAX. Меня раздражает, что если в обработчике действий что-то идет не так, Cake всегда отвечает страницей с ошибкой и HTTP-статусом 200, что означает молчаливый сбой, поэтому мне нужно открыть новое окно и запустить 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, без Cake) страницу:
<?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 для автоматической обработки ошибок в контроллере / обработчиках действий, которые не требуют больших затрат кода.
Превосходные сообщения о CakePHP и jQuery - ненавязчивые действия и Использование кодов состояния HTTP для отражения успеха / неудачи запроса веб-службы? помогают сообщить мне, что я нахожусь правильный путь, но они все еще не удовлетворяют мое желание заставить Cake возвращать HTTP-ответ в 50 раз, когда происходит какое-то неожиданное исключение. Затем, когда ответ возвращается, браузер может отобразить на странице сообщение, например: «Произошла ошибка, сообщите веб-мастеру», и я хотел бы заглянуть в журнал ошибок Apache, чтобы узнать, что на самом деле произошло.
Все идеи приветствуются.