また、ajax リクエスト (私の場合は jquery mobile) を使用するときのカスタム例外とエラー コードにも苦労しました。これが、デバッグモードを上書きすることなく、私が思いついた解決策です。開発モードでカスタム エラーをスローし、オプションでプロダクション モードでもスローします。私はそれが誰かを助けることを願っています:
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');
}
}
}
デバッグ モードで例外を表示するConfigure::read('debug') > 0
場合は、省略できます。ビューerrorjson.ctpは「Error/errorjson.ctp」にあります。
<?php
echo json_encode($response);
?>
この場合、私の例外が呼び出されます
テスト例外
次のように定義されます。
<?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);
}
}
$code = 2
json 応答のカスタム エラー コード 2, があります。ajax 応答は、次の json データでエラー 500 をキャストします。
{"errorCode":"2","errorMessage":"My custom exception."}
明らかに、コントローラーから例外をスローする必要もあります。
throw new TestException();
例外レンダラーhttp://book.cakephp.org/2.0/en/development/exceptions.html#using-a-custom-renderer-with-exception-renderer-to-handle-application-exceptionsを含めます
これは少し範囲外かもしれませんが、JQuery で ajax エラー応答を処理するために、以下を使用します。
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
//deal with my json error
});