最常见的错误形式例如 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. android_sdcard读写(一)

    现在的android手机其实就是一个小小的掌上电脑,平时电脑有的硬件它估计也有了.这次本人研究下了其中充当手机硬盘的角色,就是sdcard.这是一个保存应用程序的好地方. 老规矩,上代码,学习代码才是 ...

  2. [记录]NGINX配置HTTPS性能优化方案一则

    NGINX配置HTTPS性能优化方案一则: 1)HSTS的合理使用 2)会话恢复的合理使用 3)Ocsp stapling的合理使用 4)TLS协议的合理配置 5)False Start的合理使用 6 ...

  3. map全局缓存demo

    import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; ...

  4. 我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了

    我这边测了一下,发现#后面参数变化浏览器不会刷新,但是#一旦去掉就会刷新了,你那边的url拼的时候能不能在没参数的时候#也拼在里面,这样应该就OK了

  5. WMI_COM_API

    Win32_Processor // CPU 处理器 Win32_PhysicalMemory // 物理内存 Win32_Keyboard // 键盘 Win32_PointingDevice // ...

  6. 个人永久性免费-Excel催化剂功能第82波-复制粘贴按源区域大小自动扩展收缩目标区域

    日常工作中,复制粘贴的操作,永远是最高频的操作,没有之一,在最高频的操作上,进行优化,让过程更智能,比一天到晚鼓吹人工智能替换人的骇人听闻的新闻来得更实际.此篇带来一点点的小小的改进,让日后无数的复制 ...

  7. nginx处理302、303和修改response返回的header和网页内容

    背景 遇到一个限制域名的平台,于是使用nginx在做网站转发,其中目标网站在访问过程中使用了多个302.303的返回状态,以便跳转到指定目标(为什么限制,就是防止他的网站的镜像). 在查找了一段资料后 ...

  8. .net持续集成sonarqube篇之sonarqube基本操作(一)

    系列目录 Sonarqube Web管理界面虽然设计的简洁大方,也非常直观,但是由于功能繁多,这对快速入手以及快速定位到想要的功能都是一个挑战,在以后的几个小节里我们简要介绍. OwerView(概览 ...

  9. 转载——Asp.Net MVC+EF+三层架构的完整搭建过程

    转载http://www.cnblogs.com/zzqvq/p/5816091.html Asp.Net MVC+EF+三层架构的完整搭建过程 架构图: 使用的数据库: 一张公司的员工信息表,测试数 ...

  10. Chrome离线安装包+谷歌访问助手

    Chrome离线安装包+谷歌访问助手 所有chrome版本离线安装包下载地址 谷歌访问助手v2.3.0.crx(需要修改主页) 谷歌上网助手v1.4.3.crx(不用修改主页,需要注册) 两个插件为2 ...