小叮当的肚兜

小叮当的肚兜

https://www.easydo.work/

  • 财富值40230
  • 威望值270
  • 总积分43890

个人信息

  • 2018-09-09 已签到
    连续签到73天,获得了20个金钱
  • 问题已经解决,
    由于有请求我在控制器中没写 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)
    })
    

    响应内容将输出:

    json-error.png

    参考: 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个金钱
  • 看着没毛病 把错误堆栈发全.

  • 2018-09-07 已签到
    连续签到71天,获得了20个金钱
  • 2018-09-06 已签到
    连续签到70天,获得了20个金钱
  • 回复了 的说说
    在用Yii2开发项目过程中会有各种个性需求,你们会去修改Yii2核心框架吗?
    建议不要改,还有升级呢,集成一下就好了.
副董事长 等级规则
43890/50000
资料完整度
60/100
用户活跃度
100/100

Ta的关注

11

Ta的粉丝

13

Ta的访客

148