tp5 针对对异常,在debug模式下,会直接以页面返回的形式显示出各类错误。如果debug关机,显示

页面错误!请稍后再试~

ThinkPHP V5.1.38 LTS { 十年磨一剑-为API开发设计的高性能框架 }
 
在做api接口的时候,这样对客户端是不太友好的。
客户端理论上只处理返回的json数据,应该对出现的异常情况也返回一个默认的json数据,确保接口返回数据的格式一致。
 
在网上参考了一些资料,文档,结合深入源码。大致总结了自己的一套全局异常处理类,可直接使用。
 
先简单讲一下我看源码的思路。
通过index.php可以看到base.php里定义了
// 注册错误和异常处理机制
Error::register();
 
Error这个基础错误类里的register()方法定义了异常使用触发的函数操作。触发此类下的appException() 方法。
而appException() 方法里
 
self::getExceptionHandler()->render($e)->send()

 

getExceptionHandler()是判断有没有自定义的异常处理类,如果没有默认使用namespace think\exception\Handle类处理异常(也就是tp5的默认处理方式)。
而我们可以在namespace think\App里的初始化函数定义了一个操作,如果配置里定义了自定义的异常处理类,那么就使用自定义异常处理类。也就是不用Handle类了。
大致思路是这样,我们开始具体操作

首先我在 新建 namespace app\common\exception\ApiHandleException类


<?php
/**
* Created by PhpStorm.
* User: wangjing4
* Date: 2019-12-17
* Time: 9:19
*/ namespace app\common\exception; use Exception;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\ErrorException;
use think\exception\PDOException;
use think\facade\Log; class ApiHandleException extends Handle
{ public function render(Exception $e)
{
if( config('app_debug') ){
return parent::render($e); }else{
$log['apiError'] = $this->getApiError($e);
$log['getData'] = $_GET;
$log['postData'] = $_POST;
$log['headerData'] = $_SERVER;
$re = $this->recordErrorLog($log); if ($e instanceof HttpException) {
return json(array('msg'=>'请求错误','code'=> 400));
}
if ($e instanceof ErrorException) {
return json(array('msg'=>'返回异常','code'=> 500));
} if ($e instanceof PDOException) {
return json(array('msg'=>"SQL异常",'code'=> 600));
} } } private function getApiError($e){
$data = [];
if ($e instanceof HttpException) {
$data['msg'] = $e->getMessage();
}
if ($e instanceof ErrorException) {
$data['msg'] = $e->getMessage();
$data['file'] = $e->getFile();
$data['line'] = $e->getLine();
} if ($e instanceof PDOException) { $data['msg'] = $e->getData('Database Status');
} return $data;
} private function recordErrorLog($data)
{
Log::record($data,'error');
}
}

然后在配置文件里定义

'exception_handle' => '\app\common\exception\ApiHandleException',

这样我们自己定义的这个类就接管异常处理了。

具体看下ApiHandleException类的思路。我们启用新的异常处理类,其实最终就是要替换类里的render方法

所以新增render方法。首先ApiHandleException肯定要先继承Handle类。当我们再debug模式的时候,大部分

是我们编写接口的使用用postman类工具调试。此时tp5默认的抛出异常页面挺适合我们查看错误的。所以就默认

启用Handle里的render方法。而当上生产的时候,会关闭debug模式。此时我们就可以根据抛出的异常所属类来

返回大致的消息

if ($e instanceof HttpException) {
return json(array('msg'=>'请求错误','code'=> 400));
}
if ($e instanceof ErrorException) {
return json(array('msg'=>'返回异常','code'=> 500));
} if ($e instanceof PDOException) {
return json(array('msg'=>"SQL异常",'code'=> 600));
}

  

  这几个异常类型是我自己调试出来的。基本就这三种异常错误。

当你你访问不存在的控制器或者方法的时候是会被 think\exception\HttpException;类抛出。

当页面代码有拼写错误的时候,一般就是会think\exception\ErrorException报500错误。

而当sql语句问题导致的错误会被think\exception\PDOException抛出

生产环境需要记录日志的时候,我使用了tp5的默认日志方法,根据不同报错,保存了每种错误类型的基本信息,确保后端根据日志快速定位问题点。

比如HttpException错误;异常本身的错误提示基本就可以知道问题出在哪了。

而ErrorException可能就要定位到错误文件,错误的行数以及错误的提示语。

当遇到PDOException错误的时候,错误类默认记录的PDO Error Info数据即可帮助我们快速知道错误sql

tp5异常全局返回处理的更多相关文章

  1. springmvc 通过异常增强返回给客户端统一格式

    在springmvc开发中,我们经常遇到这样的问题:逻辑正常执行时返回客户端指定格式的数据,比如json,但是遇NullPointerException空指针异常,NoSuchMethodExcept ...

  2. atitit.架构设计---方法调用结果使用异常还是返回值

    atitit.架构设计---方法调用结果使用异常还是返回值 1. 应该返回BOOL类型还是异常 1 2. 最终会有四种状况,抛出异常.返回特殊值.阻塞.超时 1 3. 异常的优缺点点 1 4. jav ...

  3. Asp.net MVC3 异常全局过滤器处理

    1.建立异常全局过滤器处理机制,在Gloabal.asax.cs文件中,有如下代码块: public static void RegisterGlobalFilters(GlobalFilterCol ...

  4. Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json

    需求 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0,  "data": {},  "msg": ...

  5. Spring MVC全局异常后返回JSON异常数据

    问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...

  6. springmvc全局异常后返回JSON异常数据

    转自:http://www.cnblogs.com/exmyth/p/5601288.html (1)自定义或者使用spring自带的各种异常处理器 例如spring基于注解的异常解析器Annotat ...

  7. 编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]

    前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题, ...

  8. (办公)springmvc->controller的统一异常层,返回json

    controller里面写的代码,很多时候,没有写try{}catch(Exceiption ex){},结果就是系统出错,就算是接口,参数正确也会返回404,这个是不应该的. 下面是代码,以后参考 ...

  9. ARM异常中断返回的几种情况

    在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下:   重要基础知识:R15(PC)总是 ...

随机推荐

  1. windows cmd command

    ////////////////// ===>windows + r //gpedit.msc 用户组策略 ///////////////// ===>cmd //ping www.bai ...

  2. 树形dp——cf1092F

    被傻逼题降智了.. 就是第一次dfs 时 求一次size,一次deep数组 然后第二次dfs时直接求最大值 先把结点1的值求出来, u->v过程中,v子树的所有结点深度-1,v外的所有结点深度+ ...

  3. vue+Iview+gulp 生成文档说明

    1.安装npm gulp相关插件 比如:gulp.gulp-concat.gulp-htmlmin.gulp-cssmin.gulp-cheerio.gulp-clean 2. 编写gulpfile. ...

  4. 命令学习_nslookup

    nslookup 域名 这是最常用最简单的用法,可以直接获得目标域名的IP地址和CNAME. 如下是A记录的返回情况 nslookup命令会采用先反向解释获得使用的DNS服务器的名称,上图中ns.gu ...

  5. 杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务

    ylbtech-杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出 ...

  6. .NETFramework-Web.Mvc:HttpXxxAttribute-目录

    ylbtech-.NETFramework-Web.Mvc:HttpXxxAttribute-目录 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返 ...

  7. day19_生成器

    20180730 初次上传 20180731 更新,4.列表生成式,以及部分注释 #!/usr/bin/env python # -*- coding:utf-8 -*- # ************ ...

  8. day 65 Django基础一之web框架的本质

      Django基础一之web框架的本质   django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基 ...

  9. Java必备的几个开发工具,你会几个?

    Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 常用工具干货,会从以下几个方面汇总,本文会长期更新. 开发工具篇 M ...

  10. mybatis-plus分页查询

    在springboot中整合mybatis-plus 按照官方文档进行的配置:快速开始|mybatis-plus 引入依赖: <!-- 引入mybatisPlus --> <depe ...