tp5异常全局返回处理
tp5 针对对异常,在debug模式下,会直接以页面返回的形式显示出各类错误。如果debug关机,显示
页面错误!请稍后再试~
// 注册错误和异常处理机制
Error::register();
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异常全局返回处理的更多相关文章
- springmvc 通过异常增强返回给客户端统一格式
在springmvc开发中,我们经常遇到这样的问题:逻辑正常执行时返回客户端指定格式的数据,比如json,但是遇NullPointerException空指针异常,NoSuchMethodExcept ...
- atitit.架构设计---方法调用结果使用异常还是返回值
atitit.架构设计---方法调用结果使用异常还是返回值 1. 应该返回BOOL类型还是异常 1 2. 最终会有四种状况,抛出异常.返回特殊值.阻塞.超时 1 3. 异常的优缺点点 1 4. jav ...
- Asp.net MVC3 异常全局过滤器处理
1.建立异常全局过滤器处理机制,在Gloabal.asax.cs文件中,有如下代码块: public static void RegisterGlobalFilters(GlobalFilterCol ...
- Spring Boot @ControllerAdvice 处理全局异常,返回固定格式Json
需求 在构建RestFul的今天,我们一般会限定好返回数据的格式比如: { "code": 0, "data": {}, "msg": ...
- Spring MVC全局异常后返回JSON异常数据
问题: 当前项目是作为手机APP后台支持,使用spring mvc + mybaits + shiro进行开发.后台服务与手机端交互是发送JSON数据.如果后台发生异常,会直接返回异常页面,显示异常内 ...
- springmvc全局异常后返回JSON异常数据
转自:http://www.cnblogs.com/exmyth/p/5601288.html (1)自定义或者使用spring自带的各种异常处理器 例如spring基于注解的异常解析器Annotat ...
- 编写高质量代码改善C#程序的157个建议[用抛异常替代返回错误、不要在不恰当的场合下引发异常、重新引发异常时使用inner Exception]
前言 自从.NET出现后,关于CLR异常机制的讨论就几乎从未停止过.迄今为止,CLR异常机制让人关注最多的一点就是“效率”问题.其实,这里存在认识上的误区,因为正常控制流程下的代码运行并不会出现问题, ...
- (办公)springmvc->controller的统一异常层,返回json
controller里面写的代码,很多时候,没有写try{}catch(Exceiption ex){},结果就是系统出错,就算是接口,参数正确也会返回404,这个是不应该的. 下面是代码,以后参考 ...
- ARM异常中断返回的几种情况
在学习韦老师视频中中断异常部分时候,对于发生中断时需要执行的#保存异现场 #恢复现场 中的“返回”弄不清楚,查阅网络文章后,发现一篇概述我觉得我能理解的一篇如下: 重要基础知识:R15(PC)总是 ...
随机推荐
- php 引用文件
require_once :为了避免重复加载文件. 用意:加载文件一次. require_once() 语句在脚本执行期间包括并运行指定文件.此行为和require()语句类似,唯一区别是:如果该文件 ...
- 阿里云代码管理平台 Teambition Codeup(行云)亮相,为企业代码安全护航
2019杭州云栖大会企业协作与研发效能专场,企业协同平台Teambition负责人齐俊元正式发布阿里云自研的代码管理平台Teambition Codeup(行云),Codeup是一款企业级代码管理产品 ...
- JAVA基础_泛型
什么是泛型 泛型是提供给javac编译器使用的,可以限定集合中的输入类型,让编译器挡住源程序中的非法输入,编译器编译带类型说明的集合时会去除掉"类型"信息,是程序的运行效率不受影响 ...
- vue+el-menu+vue-router实现动态导航条
导航栏组件template <template> <div class="sidebar"> <el-menu unique-opened :defa ...
- DNS配置-BIND安装配置全过程
下载地址:ftp://ftp.isc.org/isc/ 下载bind,我下载的是bind-9.11.13.tar.gz 我下载的文件放在/root目录下进入目录解压缩 [root@localhost ...
- 【CF900D】Unusual Sequences
题目 智力下降严重 显然要反演了呀 首先必须满足\(x|y\),否则答案是\(0\) 我们枚举这个数列的\(gcd\)是\(d\)或者\(d\)的倍数 于是答案就是 \[\sum_{x|d}[d|y] ...
- Mid-Atlantic 2008 Lawrence of Arabia /// 区间DP oj21080
题目大意: 输入n,m 输入n个数 将n个数切割m次分为m+1段,使得各段的Strategic Value总和最小 一组数a b c d的SV值为 a*b + a*c + a*d + b*c + b* ...
- C++ 系列:typedef 和 #define 的区别
总结一下typedef和#define的区别 1.概念 #define 它在编译预处理时进行简单的替换,不作正确性检查.它是预处理指令. typedef 它在自己的作用域内给一个已经存在的类型一个别名 ...
- springboot中pageHelper插件 list设置不进去 为null
分页pageHelper中list放不进去值 为null,可能的解决方案如下: 1. 注意代码顺序,PageHelper.startPage(pageNumber,pageSize)要放在查询Lis ...
- 2016.9.15初中部上午NOIP普及组比赛总结
2016.9.15初中部上午NOIP普及组比赛总结 2016.09.15[初中部 NOIP普及组 ]模拟赛 又翻车了!表示时超和空超很可恨! 进度 比赛:AC+0+0+20=120 改题:AC+80+ ...