最常见的错误形式例如 controller不存在或者 action不存在之类的 我们第一时间想到的 就是 使用 try{}catch(){} 来捕获 例如:

    /**
* show方法在common里定义过--统一返回接口
* @return array
*/
public function Test(){
try{
model("asda");
}catch (\Exception $e){
return show(0,$e->getMessage(),'',400)
}
}

但是有的错误我们是没有办法捕获到的 会返回如下格式

我们API是没有办法识别的 所以遇到这种情况 我们应该怎么解决呢?

首先 不论什么框架 他都有自己的 错误渲染机制 我们应当找到这个渲染机制 去修改它 TP5框架 在 thinkphp/library/think/exception/Handle.php 中 在这个文件中 有一个 render 方法

  /**
* Render an exception into an HTTP response.
*
* @param \Exception $e
* @return Response
*/
public function render(Exception $e)
{
if ($this->render && $this->render instanceof \Closure) {
$result = call_user_func_array($this->render, [$e]);
if ($result) {
return $result;
}
} if ($e instanceof HttpException) {
return $this->renderHttpException($e);
} else {
return $this->convertExceptionToResponse($e);
}
}

我们需要重写这个方法 使之返回我们想要json格式数据

新建一个类来继承Handle类

<?php
namespace app\common\lib\exception;
use think\exception\Handle; /**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 11:20
*/
class ApiHandleException extends Handle
{
public $httpCode = 500;
  
public function render(\Exception $e){
return show(0,$e->getMessage(),[], $this->httpCode);
}
}

写好之后 我们还需要在TP5的配置文件中 修改异常处理类 在application\config.php中 大概163行

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

指向我们重构的类

接下来我们再去请求 就会返回我们想要的json格式啦

但是问题随之而来了 如果我们出现如下代码报错的话 状态会是 500

    public function test(){
$data = [
'aa' => 1,
'ss' => 2,
];
if($data['ss'] != 1){
exception('你提交的数据有问题');
}
}

所以需要我们去创建一个 内部的异常类

<?php
/**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 11:36
*/ namespace app\common\lib\exception; use think\Exception; class ApiException extends Exception
{
public $message = '';
public $httpCode = 500;
public $code = 0; public function __construct($message = '' , $httpCode = 0, $code = 0)
{
$this->httpCode = $httpCode;
$this->message = $message;
$this->code = $code;
}
}

创建好了之后 我们需要去修改我们之前创建的  ApiHandleExecption  类

<?php
namespace app\common\lib\exception;
use think\exception\Handle; /**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 11:20
*/
class ApiHandleException extends Handle
{
public $httpCode = 500; public function render(\Exception $e){
if ($e instanceof ApiException) {
       ##$e->httpCode 就是ApiException里面的 $this->httpCode;
$this->httpCode = $e->httpCode;
}
return show(0,$e->getMessage(),[], $this->httpCode);
}
}

这样我们的状态码也会随之改变  不过 我们还需要在进一步的 优化 ApiHandleException 类 因为 这样的异常形式 是给API看的 而我们在开发的时候 是需要渲染错误的 所以我们修改一下代码

<?php
namespace app\common\lib\execption;
use think\Config;
use think\exception\Handle; /**
* Created by PhpStorm.
* User: Administrator
* Date: 2019/8/15
* Time: 11:20
*/
class ApiHandleExecption extends Handle
{
public $httpCode = 500; public function render(\Exception $e){
     ##判断debug模式是否开启 如果开启 用他父级的 render方法 进行异常渲染
if(config('app_debug') == true){
return parent::render($e);
}
if ($e instanceof ApiException) {
$this->httpCode = $e->httpCode;
}
return show(0,$e->getMessage(),[], $this->httpCode);
}
}

至此我们的 内部异常就解决了 梳理下流程 :

首先我们需要 找到 内部异常渲染类(ApiHandleException) 重构它的render方法 重构之后 我们需要进一步的 更改状态码 所以需要新建 一个 类(ApiException)来初始化他们的状态码等数据 初始化之后 我们还需要进一步修改我们自己写的异常渲染类(ApiHandleException) 使之在debug模式下 可以正常渲染

TP5使用API时不可预知的内部异常的更多相关文章

  1. 基于Keil C的覆盖分析,总结出编程中可能出现的几种不可预知的BUG

    基于Keil C的覆盖分析,总结出编程中可能出现的几种不可预知的BUG,供各位网友参考 1.编译时出现递归警告,我看到很多网友都采用再入属性解决,对于再入函数,Keil C不对它进行覆盖分析,采用模拟 ...

  2. tp5页面输出时,搜索后跳转下一页的处理

    tp5页面输出时,搜索功能在跳转下一页时,如果不做任何处理,会返回原有是第二页输出的数据.为了保证跳转下一页时输出的是搜索到的数据,做以下处理. (要根据自己的搜索字段进行适当修改) 页面js代码,给 ...

  3. Web API核查表:设计、测试、发布API时需思考的43件事[转]

    Web API核查表:设计.测试.发布API时需思考的43件事   当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...

  4. C#中调用Windows API时的数据类型对应关系

    原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE=System.UInt16 CHAR=System. ...

  5. 使用Redmine的PHP API时,如何判断需求是否为原子需求

    使用Redmine的PHP API时,如何判断需求是否为原子需求 使用redmine的PHP接口时,怎样才能判断需求是否为原子需求呢,下面给出具体的做法: /** * 判断是否为原子需求, 即是否依然 ...

  6. 腾讯微博API时间线相关接口返回的微博信息中head值使用问题

    腾讯微博API时间线相关接口返回的微博信息中head值表示作者头像url,这个链接直接访问并不能使用,需要再附加一个参数指定图片的大小(100.50),比如:[head]/100.

  7. 在Angular.js中的H5页面调用Web api时跨域问题处理

    /// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...

  8. 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全

    原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...

  9. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_18-异常处理-不可预知异常处理

    框架抛出来的或者一些第三方的组件抛出来的异常.我们根本不知道它所对应的错误代码的信息,所以我们也没有办法给用户返回具体的错误代码和错误信息. 我们先在Map中定义有一些不可预知的异常,定义错误代码和错 ...

随机推荐

  1. VMware下的Centos7实践Kvm虚拟化(通俗易懂)

    虽然网上已经有很多关于kvm安装的教程了,但我还是看得头晕,有的教程里安装的包很多,有的很少,也没说明那些安装包的作用是干嘛的,用的命令也不一样,也没解释命令的意思是什么. 我重新写一个教程,尽量通俗 ...

  2. C++学习书籍推荐《C++编程思想第二版第一卷》下载

    百度云及其他网盘下载地址:点我 编辑推荐 “经典原版书库”是响应教育部提出的使用原版国外教材的号召,为国内高校的计算机教学度身订造的.<C++编程思想>(英文版第2版)是书库中的一本,在广 ...

  3. Spark 中 RDD的运行机制

    1. RDD 的设计与运行原理 Spark 的核心是建立在统一的抽象 RDD 之上,基于 RDD 的转换和行动操作使得 Spark 的各个组件可以无缝进行集成,从而在同一个应用程序中完成大数据计算任务 ...

  4. 从壹开始[ 做贡献 ]之三 || 北京.Net俱乐部活动——DNT精英论坛开幕

    缘起 哈喽大家好!好久不见,可能有一部分小伙伴发现我好久没有写文章了,是不是懒惰了,并没有,这两周也是正式开始了<NetCore系列教程的视频录制>,不过还不多,预计会是每周一个视频,基本 ...

  5. 详细记录登录过程的用户、IP地址、shell命令以及详细操作时间

    将下面的代码添加到/etc/profile #history USER_IP=`>/dev/null|awk '{print $NF}'|sed -e 's/[()]//g'` HISTDIR= ...

  6. java高并发系列 - 第12天JUC:ReentrantLock重入锁

    java高并发系列 - 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇. synchronized的局限性 synchronized是java内置 ...

  7. MyBatis从入门到精通:insert用法

    2.4.1 简单的insert方法 1.接口类中的方法: int insert(SysUser sysUser); 2.映射文件中的修改: <!-- insert标签包含如下的属性: id: p ...

  8. 洛谷P2319 [HNOI2006]超级英雄 题解

    题目链接: https://www.luogu.org/problemnew/show/P2319 分析 每错,这是一道海南不对是河南呀呀呀错了是湖南的省选题. 但是还是可以作为二分图第二题来练手的, ...

  9. 微服务SpringCloud之熔断监控Hystrix Dashboard和Turbine

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数 ...

  10. Python入门基础(9)__面向对象编程_3

    继承 子类自动继承父类的所有方法和属性 继承的语法: class 类名(父类名) pass 1.子类继承父类,可以直接使用父类中已经封装好的方法,不需要再次开发 2.子类可以根据需求,封装自己特有的属 ...