学习thinkphp5不可预知的内部异常api数据输出解决方案

53 篇文章 1 订阅
22 篇文章 1 订阅

原报错异常

在save 方法中创造一个报错,如下,无data变量,但是echo,


    //post 需要定义$id
    public function save()
    {

        echo $data;

        $post_data = input('post.');
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

请求报错,抛出异常
在这里插入图片描述

自带报错异常,是调用的根目录下\thinkphp\library\think\exception 中Handle.php类的render方法
在这里插入图片描述

    public function render(Exception $e)
    {
        if ($e instanceof HttpException) {
            return $this->renderHttpException($e);
        } else {
            return $this->convertExceptionToResponse($e);
        }
    }

我们需要新建一个类,重新渲染render方法,改变抛出异常的方式

封装报错异常类

1、创建文件ApiHandleException.php

在thinkphpwu\application\common\lib\exception 目录下创建ApiHandleException.php文件
在这里插入图片描述
具体代码如下:

<?php

namespace app\common\lib\exception;


//引用异常类
use think\exception\Handle;

//继承异常类
class ApiHandleException extends Handle
{

    //自定义http状态码
    public static $httpCode = 500;

    //覆盖原有render方法
    public function render(\Exception $e)
    {
        return show(0, $e->getMessage(), [], self::$httpCode);
    }

}

2、修改config.php配置

在application目录下的config.php中找到exception_handle

在这里插入图片描述
修改:

    // 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle' => 'app\common\lib\exception\ApiHandleException',

postman测试

在这里插入图片描述

封装业务抛出异常类

我们在执行业务时,会遇到与后台判断不符合要求的异常处理,并抛出,如果只是用框架本身的异常类,并不能满足业务需求,

比如我们修改一个save方法

    //post 需要定义$id
    public function save()
    {
        $post_data = input('post.');
        if ($post_data['url'] != 'qipa250.com') { 
        //抛出异常      
            exception('域名不正确');
        }
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

在这里插入图片描述
我们请求时,会发现,http的状态码是500,这并不合理,我们需要封装异常类来定义httpcode码

在根目录的application\common\lib\exception下创建ApiException.php 类
在这里插入图片描述
具体代码如下:

<?php

namespace app\common\lib\exception;

//引用异常类
use think\Exception;


//继承异常类
class ApiException extends Exception
{
    //自定义http状态码
    public $message = '';
    public $httpCode = 400;
    public $code = 0;

    /*
     * 渲染抛出异常的状态码和信息
     */
    public function __construct($message = "", $httpCode = 0, $code = 0)
    {
        $this->message = $message;
        $this->httpCode = $httpCode;
        $this->code = $code;
    }
}

在控制器中save方法中引用

//在class的顶部引用
use app\common\lib\exception\ApiException;


    //post 需要定义$id
    public function save()
    {
        $post_data = input('post.');
        if ($post_data['url'] != 'qipa250.com') {
            //抛出异常
            throw new ApiException('域名不正确', 444, 1);
        }
        $data = array(
            'post_data' => $post_data
        );
        return show(0, '保存成功!', $data);
    }

修改ApiHandleException 类中的render方法

    //覆盖原有render方法
    public function render(\Exception $e)
    {
        //如果debug模式开启,则直接返回报错信息
        if (config('app_debug') == true) {
            return parent::render($e);
        }
        //否则debug模式关闭,返回格式化的报错信息
        if ($e instanceof ApiException) {
            self::$httpCode = $e->httpCode;
        }
        return show(0, $e->getMessage(), [], self::$httpCode);
    }

再次请求,可以看到httpcode的值已修改了

在这里插入图片描述

debug模式开启和关闭

在application目录的config.php配置文件中 ,找到app_debug

    // 应用调试模式
    'app_debug' => false, //false为关闭,true为开启

关闭调试模式 返回的是如下内容:

在这里插入图片描述
开启调试模式,则返回如下内容:
更能直观的看到报错信息,生产环境中,一定要关闭调试模式
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值