También he tenido problemas con las excepciones personalizadas y los códigos de error cuando uso las solicitudes ajax (jquery mobile en mi caso). Aquí está la solución que se me ocurrió, sin involucrar sobrescribir el modo de depuración. Lanza errores personalizados en el modo de desarrollo, y también opcionalmente en modo de producción. Espero que ayude a alguien:
AppExceptionRenderer.php:
<?php
App::uses('ExceptionRenderer', 'Error');
class AppExceptionRenderer extends ExceptionRenderer
{
public function test($error)
{
$this->_sendAjaxError($error);
}
private function _sendAjaxError($error)
{
//only allow ajax requests and only send response if debug is on
if ($this->controller->request->is('ajax') && Configure::read('debug') > 0)
{
$this->controller->response->statusCode(500);
$response['errorCode'] = $error->getCode();
$response['errorMessage'] = $error->getMessage();
$this->controller->set(compact('response'));
$this->controller->layout = false;
$this->_outputMessage('errorjson');
}
}
}
Usted puede dejar de lado Configure::read('debug') > 0
si desea mostrar la excepción en modo de depuración. La vista errorjson.ctp se encuentra en 'Error/errorjson.CTP ':
<?php
echo json_encode($response);
?>
En este caso mi excepción se llama
TestException
y se define de la siguiente manera:
<?php
class TestException extends CakeException {
protected $_messageTemplate = 'Seems that %s is missing.';
public function __construct($message = null, $code = 2) {
if (empty($message)) {
$message = 'My custom exception.';
}
parent::__construct($message, $code);
}
}
donde tengo un código de error personalizado 2, $code = 2
, para mi respuesta json. La respuesta ajax arrojará un error 500 con los siguientes datos JSON:
{"errorCode":"2","errorMessage":"My custom exception."}
Obviamente, también es necesario para iniciar la excepción de su controlador:
throw new TestException();
e incluye el procesador de excepción http://book.cakephp.org/2.0/en/development/exceptions.html#using-a-custom-renderer-with-exception-renderer-to-handle-application-exceptions
Esto puede estar un poco fuera de alcance, pero para manejar la respuesta de error ajax en JQuery utilizo:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
//deal with my json error
});
Aunque esta no era la respuesta que esperaba, ya que implica que estoy en modo de depuración, lo marcaré como correcto ya que nadie más parece tener alguna idea al respecto. ¡Gracias por el esfuerzo! –