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. MySQL基础知识 数据库 数据表

    1.数据库结构 库 表 数据 2. sql(structured query language)结构化查询语言 管理数据库 管理表 管理数据 3.数据库 增删改查 增 create database  ...

  2. JQuery Ajax 向后台传参方式

    在jquery的ajax函数中,可以传入3种类型的数据 文本:"uname=alice&mobileIpt=110&birthday=1983-05-12" jso ...

  3. bootstrap1总结

    bootstrap中的排版----标题: 标题(h1~h6/.h1~.h6) 副标题(small) h1:36px h2:30px h3:24px h4:18px h5:14px h6:12px 排版 ...

  4. iOS开发之SceneKit框架--SCNAction.h

    1.SCNAction简介 主要负责节点SCNNode的属性,实现node的渐变.移动.出现.消失.实现动画等. 2.相关API 节点的移动(earthNode的初始坐标(5,0,0)) //从当前位 ...

  5. Pycharm中如何加载多个项目同时存在

    原文地址: http://www.cnblogs.com/mrgavin/p/6382406.html 今天在使用Pycharm工具练习Python时遇到一个疑问:在已存有项目A工程的前提下如何新建另 ...

  6. day 55 Django基础五之django模型层(一)单表操作

      Django基础五之django模型层(一)单表操作   本节目录 一 ORM简介 二 单表操作 三 章节作业 四 xxx 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它 ...

  7. Java之RabbitMQ(二)多mq配置

    场景: springboot单项目,自身使用mq中间件处理一些业务需求,某些业务上又需要消费第三方mq消息,这时候需要我们单项目中配置多套mq,这时候,需要我们自定义多套mq相关连接工厂.模板.监听工 ...

  8. HDU 1147 /// 判断两线段相交

    题目大意: 给定n条线段的端点 依次放上n条线段 判断最后在最上面(不被覆盖)的线段有哪些 到当前线段后 直接与之前保存的未被覆盖的线段判断是否相交就可以了 #include <cstdio&g ...

  9. 【左偏树】 [JLOI2015]城池攻占

    原来左偏树还可以打tag,get了 和线段树打tag一样,时不时Push_Down就好了 然后这里显然也是要先乘法后加法的 tag打上了之后还是其他一般左偏树差不多,有些细节注意一下 然后开 long ...

  10. 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field

    我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...