Tôi cũng đã gặp khó khăn với các ngoại lệ tùy chỉnh và mã lỗi khi sử dụng yêu cầu ajax (jquery di động trong trường hợp của tôi). Đây là giải pháp mà tôi đưa ra, mà không liên quan đến việc ghi đè chế độ gỡ lỗi. Nó ném lỗi tùy chỉnh trong chế độ phát triển, và cũng tùy chọn trong chế độ sản xuất. Tôi hy vọng nó sẽ giúp ai đó:
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');
}
}
}
Bạn có thể bỏ qua Configure::read('debug') > 0
nếu bạn muốn hiển thị các ngoại lệ trong chế độ gỡ lỗi. Chế độ xem errorjson.ctp được đặt trong 'Lỗi/lỗi báo lỗi.ctp ':
<?php
echo json_encode($response);
?>
Trong trường hợp này ngoại lệ của tôi được gọi là
TestException
và được định nghĩa như sau:
<?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);
}
}
Nơi tôi có một mã lỗi tùy chỉnh 2, $code = 2
, để trả lời json của tôi. Các phản ứng ajax sẽ đúc một lỗi 500 với dữ liệu json sau:
{"errorCode":"2","errorMessage":"My custom exception."}
Rõ ràng, bạn cũng cần phải ném ngoại lệ từ điều khiển của bạn:
throw new TestException();
và bao gồm các renderer ngoại lệ http://book.cakephp.org/2.0/en/development/exceptions.html#using-a-custom-renderer-with-exception-renderer-to-handle-application-exceptions
Điều này có thể hơi lệch phạm vi, nhưng để xử lý phản hồi lỗi ajax trong JQuery tôi sử dụng:
$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
//deal with my json error
});
Mặc dù đây không phải là câu trả lời tôi đã hy vọng vì nó được phát hành ở chế độ gỡ lỗi, tôi sẽ đánh dấu nó là chính xác vì không ai khác có bất kỳ ý tưởng nào về điều này. Cảm ơn cho những nỗ lực! –