TP5使用API时不可预知的内部异常
最常见的错误形式例如 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时不可预知的内部异常的更多相关文章
- 基于Keil C的覆盖分析,总结出编程中可能出现的几种不可预知的BUG
基于Keil C的覆盖分析,总结出编程中可能出现的几种不可预知的BUG,供各位网友参考 1.编译时出现递归警告,我看到很多网友都采用再入属性解决,对于再入函数,Keil C不对它进行覆盖分析,采用模拟 ...
- tp5页面输出时,搜索后跳转下一页的处理
tp5页面输出时,搜索功能在跳转下一页时,如果不做任何处理,会返回原有是第二页输出的数据.为了保证跳转下一页时输出的是搜索到的数据,做以下处理. (要根据自己的搜索字段进行适当修改) 页面js代码,给 ...
- Web API核查表:设计、测试、发布API时需思考的43件事[转]
Web API核查表:设计.测试.发布API时需思考的43件事 当设计.测试或发布一个新的Web API时,你是在一个原有的复杂系统上构建新的系统.那么至少,你也要建立在HTTP上,而HTTP则是 ...
- C#中调用Windows API时的数据类型对应关系
原文 C#中调用Windows API时的数据类型对应关系 BOOL=System.Int32 BOOLEAN=System.Int32 BYTE=System.UInt16 CHAR=System. ...
- 使用Redmine的PHP API时,如何判断需求是否为原子需求
使用Redmine的PHP API时,如何判断需求是否为原子需求 使用redmine的PHP接口时,怎样才能判断需求是否为原子需求呢,下面给出具体的做法: /** * 判断是否为原子需求, 即是否依然 ...
- 腾讯微博API时间线相关接口返回的微博信息中head值使用问题
腾讯微博API时间线相关接口返回的微博信息中head值表示作者头像url,这个链接直接访问并不能使用,需要再附加一个参数指定图片的大小(100.50),比如:[head]/100.
- 在Angular.js中的H5页面调用Web api时跨域问题处理
/// <summary> /// 被请求时 /// 在Angular.js中的H5页面调用Web api时跨域问题处理 /// </summary> /// <para ...
- 如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全
原文:如何为非常不确定的行为(如并发)设计安全的 API,使用这些 API 时如何确保安全 .NET 中提供了一些线程安全的类型,如 ConcurrentDictionary<TKey, TVa ...
- 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_18-异常处理-不可预知异常处理
框架抛出来的或者一些第三方的组件抛出来的异常.我们根本不知道它所对应的错误代码的信息,所以我们也没有办法给用户返回具体的错误代码和错误信息. 我们先在Map中定义有一些不可预知的异常,定义错误代码和错 ...
随机推荐
- 网络设置管理 NetSetMan Pro v4.7.1 Lite 绿色便携版
下载地址:点我 基本介绍 Netsetman是一个小巧好用的工具,你可以设置六组不同的网络参数值,针对不同的网络环境,而调用不同的参数,当你在家中.学校.工作单位等不同环境切换网络配置文件时,只需要通 ...
- wincc C脚本如何调用第三方动态链接库dll
就Wincc本身脚本功能而言并不强大,但是wincc 脚本提供了第三方接口,如通用的Kernel32.dll,User32.dll,Gdi32.dll,大家如果对这些API接口感兴趣,可网上查找关于w ...
- Spring MVC源码(四) ----- 统一异常处理原理解析
SpringMVC除了对请求URL的路由处理特别方便外,还支持对异常的统一处理机制,可以对业务操作时抛出的异常,unchecked异常以及状态码的异常进行统一处理.SpringMVC既提供简单的配置类 ...
- Shell文件
#!/bin/bashecho "======================欢迎来到进爷故事会======================="echo "******* ...
- C++内存泄漏及检测工具详解
#include "stdafx.h" #ifdef _DEBUG #define DEBUG_CLIENTBLOCK new( _CLIENT_BLOCK, __FILE__, ...
- nginx 的信号量
参考文章:https://blog.51cto.com/5660061/2380428 nginx 中的信号量: TERM,INT 快速的结束应用程序 ,等同于 kill -9 pid QUIT 优 ...
- [leetcode] 456. 132 Pattern (Medium)
对一个三个元素以上的数组,如果存在1-3-2模式的组合,则返回true. 1-3-2模式就是值的排序是i<k<j但是下标排序是i<j<k. 解法一: 硬解,利用一个变量存储是否 ...
- Js中关于内部方法、实例方法、原型方法、静态方法的个人见解。
function foo(name){ this.name=name; // 实例方法 this.GetName=function(){ console.log("my name is &q ...
- C语言编程入门之--第一章初识程序
第一章 初识程序 导读:计算机程序无时不刻的影响着人类的生活,现代社会已经离不开程序,程序的作用如此巨大,那么程序到底是什么呢?本章主要讨论程序的概念,唤起读者对程序的兴趣,同时对C语言程序与其它语言 ...
- 通信模型socket
I/O的概念 操作系统的分为socket的I/O还有用户界面的输入输出,一般一个输入操作分为两个不同的阶段,1)等待数据准备好:2)从内核向进程复制数据 从理论上来讲,阻塞I/O.非阻塞I/O.复用I ...