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)总是 ...
随机推荐
- windows cmd command
////////////////// ===>windows + r //gpedit.msc 用户组策略 ///////////////// ===>cmd //ping www.bai ...
- 树形dp——cf1092F
被傻逼题降智了.. 就是第一次dfs 时 求一次size,一次deep数组 然后第二次dfs时直接求最大值 先把结点1的值求出来, u->v过程中,v子树的所有结点深度-1,v外的所有结点深度+ ...
- vue+Iview+gulp 生成文档说明
1.安装npm gulp相关插件 比如:gulp.gulp-concat.gulp-htmlmin.gulp-cssmin.gulp-cheerio.gulp-clean 2. 编写gulpfile. ...
- 命令学习_nslookup
nslookup 域名 这是最常用最简单的用法,可以直接获得目标域名的IP地址和CNAME. 如下是A记录的返回情况 nslookup命令会采用先反向解释获得使用的DNS服务器的名称,上图中ns.gu ...
- 杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务
ylbtech-杂项-IM:IM(即时通讯),一种基于互联网的即时交流消息的业务 即时通讯(Instant Messaging)是目前Internet上最为流行的通讯方式,各种各样的即时通讯软件也层出 ...
- .NETFramework-Web.Mvc:HttpXxxAttribute-目录
ylbtech-.NETFramework-Web.Mvc:HttpXxxAttribute-目录 1.返回顶部 2.返回顶部 3.返回顶部 4.返回顶部 5.返回顶部 6.返 ...
- day19_生成器
20180730 初次上传 20180731 更新,4.列表生成式,以及部分注释 #!/usr/bin/env python # -*- coding:utf-8 -*- # ************ ...
- day 65 Django基础一之web框架的本质
Django基础一之web框架的本质 django第一天 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基 ...
- Java必备的几个开发工具,你会几个?
Java技术栈 www.javastack.cn 优秀的Java技术公众号 以下是Java技术栈微信公众号发布的所有关于 Java 常用工具干货,会从以下几个方面汇总,本文会长期更新. 开发工具篇 M ...
- mybatis-plus分页查询
在springboot中整合mybatis-plus 按照官方文档进行的配置:快速开始|mybatis-plus 引入依赖: <!-- 引入mybatisPlus --> <depe ...