PHP/TP5 接口设计中异常处理
PHP提供 Exception 类来处理异常
new Exception('错误信息(默认为空)','错误代码(默认0)','异常链中前一个异常')
然后可以通过
e -> getMessage() 获取异常信息 e -> getCode() 获取异常错误码
处理异常
try {//可能抛出异常代码throw new Exception("Error Processing Request", 1); } catch (Exception $e) {// 1. 记录日志// 2. 处理异常,程序继续进行 / 继续向上抛出异常 / 终止程序,打印异常错误}
在ThinkPHP中,框架自带异常处理类,返回错误信息以HTML页面形式展示,如果程序出现错误开发人员没有主动捕捉异常,则会被框架捕捉,然后抛出HTML
当在接口设计中时,由于无法得知客户端类型,所以HTML的形式客户端可能无法解析,此时便需要重写异常类,以json的形式返回错误信息给客户端
异常分类:
- 自定义异常:通常是由客户端传递参数错误导致,此类异常不需要记录日志,但需要返回错误原因
- 服务器异常:代码错误导致异常,此类异常需要记录日志,但不需要返回错误原因
服务器异常错误一般由PHP或者框架抛出,自定义异常需要手动捕捉,然后抛出
实现:
在Application/common目录下新建 exception 目录,此目录为异常类库目录
Application/common/exception/ExceptionHandler (重写后的异常处理类)
<?php namespace app\common\exception;use Exception; use think\exception\Handle; use think\facade\Request; use think\Log;class ExceptionHandler extends Handle {private $code;private $msg;private $errorCode;public function render(Exception $e) {if ($e instanceof BaseException) {//如果是自定义异常,则控制http状态码,不需要记录日志//因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常//不应当记录日志$this->code = $e->code;$this->msg = $e->msg;$this->errorCode = $e->errorCode;} else {// 如果是服务器未处理的异常,将http状态码设置为500,并记录日志if (config('app_debug')) {// 调试状态下需要显示TP默认的异常页面,因为TP的默认页面// 很容易看出问题return parent::render($e);}$this->code = 500;$this->msg = 'sorry,we make a mistake. (^o^)Y';$this->errorCode = 999;$this->recordErrorLog($e);}$request = Request::instance();$result = ['msg' => $this->msg,'error_code' => $this->errorCode,'request_url' => $request = $request->url(),];return json($result, $this->code);}/** 将异常写入日志*/private function recordErrorLog(Exception $e) {Log::init(['type' => 'File','path' => LOG_PATH,'level' => ['error'],]);Log::record($e->getMessage(), 'error');}}
这个类会判断异常来源,并作出相应处理
创建处理类后,需要修改对应配置文件,让这个类成为框架默认异常处理类
在application/config/app.php
// 异常处理handle类 留空使用 \think\exception\Handle'exception_handle' => '\app\common\exception\ExceptionHandler',
Application/common/exception/BaseException (自定义异常类基类,基础PHP自带异常类Exception)
<?php namespace app\common\exception; use think\Exception;/*** Class BaseException* 自定义异常类的基类*/ class BaseException extends Exception {public $code = 400;public $msg = 'invalid parameters';public $errorCode = 999;/*** 构造函数,接收一个关联数组* @param array $params 关联数组只应包含code、msg和errorCode,且不应该是空值*/public function __construct($params = []) {if (!is_array($params)) {return;}if (array_key_exists('code', $params)) {$this->code = $params['code'];}if (array_key_exists('msg', $params)) {$this->msg = $params['msg'];}if (array_key_exists('errorCode', $params)) {$this->errorCode = $params['errorCode'];}} }
自定义异常类
Application/common/exception/UserException (自定义异常,这里举例User模块的异常)
<?phpnamespace app\common\exception;class UserException extends BaseException {public $code = 404;public $msg = '用户不存在';public $errorCode = 60000; }
抛出自定义异常
try {//todo...throw new \app\common\exception\UserException();} catch (Exception $e) {}
此时异常展示不再是TP自带的HTML页,而是
{"msg": "用户不存在","error_code": 60000,"request_url": "/wx_shop/public/index.php/admin/banner/list"
}
转载于:https://www.cnblogs.com/xiaoliwang/p/9345088.html
PHP/TP5 接口设计中异常处理相关推荐
- 接口设计中,如何封装对json格式的数据签名
目录 一.背景介绍 二.遇到的问题 三.解决方案 1.设计一个HttpServletRequestWrapper 2.设计一个filter 四.其他辅助设计 1.定义一个注解 2.定义一个拦截器 一. ...
- 【RESTful风格】软件接口设计中RESTful风格
REST = Representational State Transfer 表述性状态转移,是一种软甲接口设计风格.总之就是一种风格 REST基于:HTTP.HTML.JSON.XML.URI 这些 ...
- API 接口设计中 Token 类型的分类与设计
在实际的网站设计中我们经常会遇到用户数据的验证和加密的问题,如果实现单点,如果保证数据准确,如何放着重放,如何防止CSRF等等 其中,在所有的服务设计中,都不可避免的涉及到Token的设计. 目前,基 ...
- 软件接口设计中的版本兼容问题处理
最近在项目中经常遇到软件版本升级后不兼容旧版本的问题,本文根据以往经验,从软件接口设计.实现等方面整理了一些兼容性设计思路. 1. 优化设计 1)接口返回值的定义 有的人喜欢用0.1等较小的数字标 ...
- CPLD/FPGA的UART接口设计之系统时钟(晶振)和波特率关系
UART(UniversalAsynchronous ReceiverTransmitter,通用异步收发器)是一种广泛使用的异步串行数据通信协议.目前大多数MCU.串口通信IC等芯片或模块均支持UA ...
- 组件对外接口设计-易用性
示例 OKHttp网络请求: FormBody formBody = new FormBody.Builder().add("pay_fee", String.valueOf(pr ...
- 微服务开放平台接口设计
什么是开放平台接口 在一些大型互联网公司,随着公司的业务发展逐渐庞大,需要和外部合伙伙伴进行合作,需要将公司的接口开放给外部其他合伙伙伴进行调用. 比如腾讯的 QQ互联网.微信开放平台.蚂蚁金服开放平 ...
- php中的全局异常,tp5 API 自定义全局异常处理(中)
我们先来梳理一下异常的分类: 异常分类 tp5 有一个全局异常处理类,如果我们想自己实现上面的分类,需要覆盖和重写默认的全局异常处理类. 我们现在在 api 模块的同级下新建一个 lib 文件夹,再新 ...
- 微型计算机控制系统设计方法,第3章 机电一体化中微型计算机控制系统及接口设计...
第三章机电一体化中微型计算机控制系统及接口设计 1.微型计算机控制系统的设计主要是解决选用微机.设计接口.选用控制形式和动作控制方式的问题. 2.在微型计算机控制系统的设计中,首先会遇到的问题是:(1 ...
最新文章
- webpage not available是什么意思_MySQL很想啊,为什么还要有noSQL?
- linux离线安装服务 =====Ubuntu16.0.4 离线部署Openssh
- Vue2.0 UI框架Element运用之DateTimePicker(el-date-picker)初始值及时间格式转化等细节问题
- 考研计算机专业介绍,2021考研:计算机专业考试科目简介
- 两数之和 python_同一屏幕播放两个视频 视频左右两个画面或视频上下两个画面如何制作...
- python实现一个简单的加法计算器_Python简易项目 加减计算器的实现
- html toast 插件,基于Bootstrap4的Toast提示插件
- Guava的介绍与使用示例
- 我们公司为什么要放弃Lombok?因为它让你的代码处于了“亚健康”状态
- Atitit 计算机通信技术概要 目录 1. OSI参考模型将整个协议垂直地分为7个层次 :	1 1.1. 通信类别	2 2. 传输方式 计算机通信可分为直接式和间接式两种。	2 2.1. 1)直
- java math类 平方_Java Math类
- 微型计算机课程设计电子密码锁,《微机原理及应用》课程设计基于74LS112的电子密码锁设计报告初版...
- panda经典四道题期末考核分享
- GraphicsLab Project之简易贴画系统(Decal System)
- Cocos2d如何实现MVC
- ffmpeg常用库、术语、API、数据结构总结
- java wmf格式图片转png
- 注册宝第五期beta2插件模块下载及说明
- Xilinx HLS 仿真报错ERROR: [SIM 211-100] CSim failed with errors.
- java新人培训_Java新人学习必要的步骤以及全套学习路线!