小叮当的肚兜
- 小叮当的肚兜 2018-09-09 已签到连续签到73天,获得了20个金钱
- 小叮当的肚兜 回答了问题 自定义错误页面和 json 响应格式
问题已经解决,
由于有请求我在控制器中没写 FORMAT_JSON ,用了重定向,配置AJAX请求如下:'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) { /* @var \yii\web\Response $response */ $response = $event->sender; // 这里我们仅针对 ajax 请求 if ( (request()->isAjax && $response->statusCode == 500)) { if($response->format != response()::FORMAT_JSON) $response->format = response()::FORMAT_JSON; // 手动将抛出异常的状态码改为 200, 确保不被 jQuery 捕获 $response->statusCode = 200; // 自定义错误显示格式,把真正的响应数据存储在 'data' option 内 $response->data = [ 'code' => 0, 'data' => '出错了!', ]; } }, ],
至于 An internal server error occurred. 这个错误是 yii\base\ErrorHandler 抛出的。这个错误很高级,故意配置错数据库,才会显示。在这个基础上在访问一个错的URL 会出现2次重复的这句话,也就是抓到了2次错误。在 yii\base\ErrorHandler类的handleFallbackExceptionMessage方法中 echo 1;exit;都会重复输出。set_exception_handler set_error_handler 这个2个函数搞的鬼。想定制一个抓取所有错误的界面简单点可以搞 web 服务器重定向了。问题过几天在关闭。大家一起讨论。
你代码中的配置仅对正常的网页请求,ajax 请求的个性化错误信息可通过配置
response
组件实现。你遇到的 500 错误是因为 response 组件在遇到错误时,直接把错误传递到客户端并被 jQuery 捕获。可以借助 Response 的 beforeSend 事件改变这种默认的行为:在发送错误前将错误信息进行封装,
'components' => [ 'response' => [ 'class' => 'yii\web\Response', 'on beforeSend' => function ($event) { $response = $event->sender; // 这里我们仅针对 ajax 请求 if ($response->format == \yii\web\Response::FORMAT_JSON) { if ($response->data !== null) { // 手动将抛出异常的状态码改为 200, 确保不被 jQuery 捕获 $response->statusCode = 200; // 自定义错误显示格式,把真正的响应数据存储在 'data' option 内 $response->data = [ 'success' => $response->isSuccessful, 'data' => $response->data, ]; } } }, ], ],
配置后,如果通过 ajax 访问下面的 action,
// in TestController.php public function actionAjaxRead() { Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; // 这里将抛出异常 return 3/0; }
$.post("/test/ajax-read", function(response) { console.log(response) })
响应内容将输出:
参考: https://www.yiiframework.com/doc/guide/2.0/zh-cn/runtime-handling-errors#error-format
谢谢了,不过有一个疑问:An internal server error occurred. 在网页不是AJAX请求为什么还会出现呢。
- 小叮当的肚兜 提出了问题自定义错误页面和 json 响应格式
- 小叮当的肚兜 2018-09-08 已签到连续签到72天,获得了20个金钱
去使用pjax
看着没毛病 把错误堆栈发全.
- 小叮当的肚兜 2018-09-07 已签到连续签到71天,获得了20个金钱
- 小叮当的肚兜 2018-09-06 已签到连续签到70天,获得了20个金钱