tp6异常自定义类接管
时间:2021-08-25
本文章向大家介绍tp6异常自定义类接管,主要包括tp6异常自定义类接管使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
异常处理接管
本着严谨的原则,框架会对任何错误(包括警告错误)抛出异常。系统产生的异常和错误都是程序的隐患,要尽早排除和解决,而不是掩盖。对于应用自己抛出的异常则做出相应的捕获处理。
1.框架支持异常处理由开发者自定义类进行接管,需要在app
目录下面的provider.php
文件中绑定异常处理类,例如:
// 绑定自定义异常处理handle类 'think\exception\Handle' => app\exception\ApiExceptionHandle::class,
2.自定义类需要继承think\exception\Handle
并且实现render
方法,可以参考如下代码:
class ApiExceptionHandle extends Handle { /** * 记录异常信息(包括日志或者其它方式记录) * * @access public * @param Throwable $exception * @return void */ public function report(Throwable $exception): void { // 使用内置的方式记录异常日志 parent::report($exception); } /** * Render an exception into an HTTP response. * * @access public * @param \think\Request $request * @param Throwable $e * @return Response */ public function render($request, Throwable $e): Response { $massageData = Env::get('app_debug', false) ? [ 'file' => $e->getFile(), 'line' => $e->getLine(), 'trace' => $e->getTrace(), 'previous' => $e->getPrevious(), ] : []; // 添加自定义异常处理机制 if ($e instanceof DbException) { return json($e->getCode(),'数据获取失败', $massageData); } elseif ($e instanceof AuthException || $e instanceof ValidateException || $e instanceof ApiException) { return json($e->getCode() ?: 400, $e->getMessage()); } elseif ($e instanceof AdminException) { return json($e->getCode(),$e->getMessage(), $massageData); } else { return json(400001,'未知错误'); } } }
上面的操作后,其实如果其他逻辑抛出异常,这个类是会响应到的.
如果抛出
throw new app\exception\cus
Exception([
10006,'自定义异常消息'
]);//这个异常类的构造函数可以自己实现
ApiExceptionHandle这个类是可以响应的,执行查不到这个异常,返回 json(400001,'未知错误');
3.现在我们实现异常类(自定义的异常类),
/** * * @package crmeb\exceptions */ class AdminException extends \RuntimeException { public function __construct($message, $code = 0, Throwable $previous = null) { if(is_array($message)){ $errInfo = $message; $message = $errInfo[1] ?? '未知错误'; if ($code === 0) { $code = $errInfo[0] ?? 400; } } parent::__construct($message, $code, $previous); } }
4.至此,我们如果在controller或Service手动抛出异常,就会返回json
throw new app\exception\AdminException([400,'后台异常']); //抛出后台异常,会被handle方法对应的if else处理返回json
5.拓展:其实这样已经可以了,如果抛异常就想第四那样写,但有时为了统一,错误的code都是统一写在一个文件,如:
ExErrorCode.php
/** * 错误码统一存放类 * Class ExErrorCode */ class ExErrorCode { const SUCCESS = [200, 'SUCCESS']; const ERROR = [400, 'ERROR']; const ERR_LOGIN_INVALID = [410000, 'Landing overdue']; //登出 const LOGIN_OUT = [410008,'登出']; }
最后这样抛出异常:
throw new app\exception\AdminException(ExErrorCode::LOGIN_OUT); //抛出后台异常,会被handle方法对应的if else处理返回json
转 : https://www.kancloud.cn/manual/thinkphp6_0/1037615#_29
原文地址:https://www.cnblogs.com/fps2tao/p/15184054.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法