最常见的错误形式例如 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. C#使用sqlite-net搭建简易的ORM

    SQLite简易版ORM 首先打开项目,使用nuget搜索sqlite-net,如下图: 下载完成后,我们会多出两个文件,SQLite.cs和SQLiteAsync.cs. 我们新建一个文件夹SQLi ...

  2. 通过代数,数字,欧几里得平面和分形讨论JavaScript中的函数式编程

    本文是对函数式编程范式的系列文章从而拉开了与以下延续一个. 介绍 在JavaScript中,函数只是对象.因此,可以构造函数,作为参数传递,从函数返回或分配给变量.因此,JavaScript具有一流的 ...

  3. GeoPackage - 一个简便轻量的本地地理数据库

    GeoPackage(以下简称gpkg),内部使用SQLite实现的一种单文件.与操作系统无关的地理数据库. 当前标准是1.2.1,该版本的html版说明书:https://www.geopackag ...

  4. 个人永久性免费-Excel催化剂功能第16波-N多使用场景的多维表转一维表

    Excel表的多维表数据结构转换为一维表的数据结构,以供更进一步对数据进行加工整理,生成另外格式的汇总表,这是Excel数据处理的一大刚需,几乎每个Excel表哥.表姐都会遇到这样的使用场景.很可惜, ...

  5. Android自定义的属性的使用

    获取引用类型的属性值 private void init(Context context, AttributeSet attrs) { //int textId = attrs.getAttribut ...

  6. [leetcode] 8. String to Integer (atoi) (Medium)

    实现字符串转整形数字 遵循几个规则: 1. 函数首先丢弃尽可能多的空格字符,直到找到第一个非空格字符. 2. 此时取初始加号或减号. 3. 后面跟着尽可能多的数字,并将它们解释为一个数值. 4. 字符 ...

  7. [leetcode ]429. N-ary Tree Level Order Traversale (easy)

    原题 思路: bfs,每一层遍历一次加到一个vector,同时把该点的子元素加到queue中. class Solution { public: vector<vector<int> ...

  8. 2019牛客多校第一场A-Equivalent Prefixes

    Equivalent Prefixes 传送门 解题思路 先用单调栈求出两个序列中每一个数左边第一个小于自己的数的下标, 存入a[], b[].然后按照1~n的顺序循环,比较 a[i]和b[i]是否相 ...

  9. js数字格式化(截断格式化或四舍五入格式化)

    /*** * 数字格式化(适合金融产品截断小数位后展示) * @param num * @param pattern (标准格式:#,###.## 或#.## 或#,###00.00) * @para ...

  10. 十一、SQL Server CONVERT() 函数

    定义和用法 CONVERT() 函数是把日期转换为新数据类型的通用函数. CONVERT() 函数可以用不同的格式显示日期/时间数据. 语法 CONVERT(data_type(length),dat ...