为了账号安全,请及时绑定邮箱和手机立即绑定

【备战春招】第6天 微信小程序电商实战-异常处理

标签:
ThinkPHP

课程章节:AOP 与全局异常处理

课程讲师:7 七月

课程内容:

  1. 全局异常处理
  • 记录日志
  • 统一返回错误信息格式
  1. 什么时候使用异常
  • 用户行为异常(没有通过验证器,没有查询到结果):不记录日志、向用户返回具体信息
  • 服务器自身异常(代码错,调用外部接口错误):记录日志,不向客户端返回具体信息
  1. 在 application 目录下创建文件夹 lib/exception(异常处理层-类库)

Exception 基类

class BaseException
{
    // HTTP 状态码
    public $code = 400;

    // 错误具体信息
    public $msg = 'invalid parameters';

    // 自定义错误码
    public $errorCode = 999;

    public $shouldToClient = true;

    /**
     * 构造函数,接收一个关联数组
     * @param array $params 关联数组只应包含code、msg和errorCode,且不应该是空值
     */
    public function __construct($params=[])
    {
        if(!is_array($params)){
            return;
        }
        if(array_key_exists('code',$params)){
            $this->code = $params['code'];
        }
        if(array_key_exists('msg',$params)){
            $this->msg = $params['msg'];
        }
        if(array_key_exists('errorCode',$params)){
            $this->errorCode = $params['errorCode'];
        }
    }
}

Exception 子类

class BannerMissException extends BaseException
{
    public $code = 404;
    public $msg = '参数错误';
    public $errorCode = 40000;
}

Handle 异常处理类

class ExceptionHandler extends Handle
{
    private $code;
    private $msg;
    private $errorCode;

    public function render(Exception $ex)
    {
        if($e instanceof BaseException) {
            //如果是自定义异常,则控制http状态码,不需要记录日志
            //因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
            //不应当记录日志

            $this->code = $e->code;
            $this->msg = $e->msg;
            $this->errorCode = $e->errorCode;
        } else {
            // 如果是服务器未处理的异常,将http状态码设置为500,并记录日志
            if(config('app_debug')){
                // 调试状态下需要显示TP默认的异常页面,因为TP的默认页面
                // 很容易看出问题
                return parent::render($e);
            }

            $this->code = 500;
            $this->msg = 'sorry, we make a mistake. (^o^)Y';
            $this->errorCode = 999;
            $this->recordErrorLog($e);
        }

        $request = Request::instance();
        $result = [
            'msg'  => $this->msg,
            'error_code' => $this->errorCode,
            'request_url' => $request = $request->url()
        ];
        return json($result, $this->code);
    }
}

config.php 配置

exception_handle => 'app\lib\exception\ExceptionHandler'

ParameterException 通用参数类异常错误

class ParameterException extends BaseException
{
    public $code = 400;
    public $errorCode = 10000;
    public $msg = "invalid parameters";
}

图片描述

课程收获:

  1. 开发 api 和开发网页是截然不同的,特别是错误返回的处理
  2. 了解 render 机制
  3. 预习:调用异常类抛出信息,TP5 日志处理
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消