wqy的笔记:http://www.upwqy.com/details/273.html

在thinkphp6 和 thinkphp5 全局异常处理 稍有不同

ThinkPHP6

在 tp6 中 框架已经给出了 应用异常处理类 ExceptionHandle

但是默认的异常处理 抛出的不是json格式的结构,不是我们想要的,所以要处理一下

看以下代码 在 render 函数中 异常实例 $e 有两种类型 一种是BaseException  一种是 框架默认抛出的异常

这里主要是说 BaseException  这是自定义的异常 ,用于处理返回结构,状态码,返回信息等数据,可以按照自己的需要处理。

具体的 返回结果返回处理 可以去 http://www.upwqy.com/details/216.html  查看

  1. namespace app;
  2. use app\common\ApiErrCode;
  3. use app\common\exception\BaseException;
  4. use app\common\response\JsonResponse;
  5. use think\db\exception\DataNotFoundException;
  6. use think\db\exception\ModelNotFoundException;
  7. use think\exception\Handle;
  8. use think\exception\HttpException;
  9. use think\exception\HttpResponseException;
  10. use think\exception\ValidateException;
  11. use think\Response;
  12. use Throwable;
  13. /**
  14. * 应用异常处理类
  15. */
  16. class ExceptionHandle extends Handle
  17. {
  18. use JsonResponse;
  19. /**
  20. * 不需要记录信息(日志)的异常类列表
  21. * @var array
  22. */
  23. protected $ignoreReport = [
  24. HttpException::class,
  25. HttpResponseException::class,
  26. ModelNotFoundException::class,
  27. DataNotFoundException::class,
  28. ValidateException::class,
  29. ];
  30. /**
  31. * 记录异常信息(包括日志或者其它方式记录)
  32. *
  33. * @access public
  34. * @param Throwable $exception
  35. * @return void
  36. *
  37. */
  38. public function report(Throwable $exception): void
  39. {
  40. // 使用内置的方式记录异常日志
  41. parent::report($exception);
  42. }
  43. /**
  44. * Render an exception into an HTTP response.
  45. * @access public
  46. * @param \think\Request $request
  47. * @param Throwable $e
  48. * @return Response
  49. */
  50. public function render($request, Throwable $e): Response
  51. {
  52. // 其他错误交给系统处理
  53. // return parent::render($request, $e);
  54. // 添加自定义异常处理机制
  55. if($e instanceof BaseException){
  56. $code = $e->getCode();
  57. $message = $e->getMessage();
  58. }else{
  59. $code = $e->getCode();
  60. if(!$code || $code < 0){
  61. $code = ApiErrCode::unknown_err['code'];
  62. }
  63. $message = $e->getMessage() ? : ApiErrCode::unknown_err['msg'];
  64. }
  65. return $this->jsonData($code,$message);
  66. }
  67. }

下面来看 BaseException ,这里表示基础异常类

其中 ApiErrCode 是定义的 错误码类 可以去 http://www.upwqy.com/details/216.html 查看

  1. namespace app\common\exception;
  2. use app\common\ApiErrCode;
  3. use think\Exception;
  4. /**
  5. * 基础异常
  6. * @user yiqiu
  7. * @email 529857614@qq.com
  8. * @date 2021/2/19 20:45
  9. * @blog http://www.upwqy.com
  10. */
  11. class BaseException extends \Exception
  12. {
  13. protected $code = ApiErrCode::unknown_err['code'];
  14. protected $message = ApiErrCode::unknown_err['msg'];
  15. public function __construct($params = [])
  16. {
  17. if(is_array($params) ){
  18. if(isset($params['code']) && $params['code']){
  19. $this->code = $params['code'];
  20. }
  21. if(isset($params['msg']) && $params['msg']){
  22. $this->message = $params['msg'];
  23. }
  24. }else if(is_string($params)){
  25. $this->message = $params;
  26. }
  27. parent::__construct($this->message, $this->code);
  28. }
  29. }

然后我们可以自定义一些异常类 ,比如下面的 ParameterException.php 表示参数异常时的处理

  1. namespace app\common\exception;
  2. use app\common\ApiErrCode;
  3. class ParameterException extends BaseException
  4. {
  5. protected $code = ApiErrCode::invalid_params['code'];
  6. protected $message = ApiErrCode::invalid_params['msg'];
  7. }

实例:

  1. $user = User::where('id',1)->find();
  2. if(!$user){
  3. throw new ParameterException('用户不存在');
  4. }

当需要指定的异常,直接 使用  throw new ParameterException('用户不存在'); 即可,返回结果如下,并且可以在任何地方使用

  1. {
  2. "code": 204,
  3. "msg": "用户不存在",
  4. "data": "",
  5. "timestamp": 1622604524
  6. }

THinkPHP5

在tp5框架中,我们需要手动创建应用异常处理类。ExceptionHandler.php

并且在配置中 修改配置

  1. 'exception_handle' => 'api\lib\exception\ExceptionHandler',

ThinkPHP 全局异常处理的更多相关文章

  1. 第6章 AOP与全局异常处理6.5-6.11 慕课网微信小程序开发学习笔记

    https://coding.imooc.com/learn/list/97.html 目录: 第6章 AOP与全局异常处理6-1 正确理解异常处理流程 13:236-2 固有的处理异常的思维模式与流 ...

  2. mvc自定义全局异常处理

    异常信息处理是任何网站必不可少的一个环节,怎么有效显示,记录,传递异常信息又成为重中之重的问题.本篇将基于上篇介绍的html2cancas截图功能,实现mvc自定义全局异常处理.先看一下最终实现效果: ...

  3. 在.NET Core程序中设置全局异常处理

    以前我们想设置全局异常处理只需要这样的代码: AppDomain currentDomain = AppDomain.CurrentDomain; currentDomain.UnhandledExc ...

  4. springMvc全局异常处理

    本文中只测试了:实现Spring的异常处理接口HandlerExceptionResolver 自定义自己的异常处理器 对已有代码没有入侵性等优点,同时,在异常处理时能获取导致出现异常的对象,有利于提 ...

  5. MVC 全局异常处理及禁用显示头

    MVC网站的global.asax中的Application_Start方法里,有这样一段代码: public class MvcApplication : System.Web.HttpApplic ...

  6. Spring MVC 解决无法访问静态文件和"全局异常处理"

    我们都知道,Spring MVC的请求都会去找controller控制器,若果我们页面中引入了一个外部样式,这样是没效果的, 我们引入样式的时候是通过<like href="...&q ...

  7. Spring Boot 2.x 系列教程:WebFlux REST API 全局异常处理 Error Handling

    摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 本文内容 为什么要全局异常处理? WebFlux REST 全 ...

  8. .NET MVC全局异常处理(二)

    目录 .NET MVC全局异常处理(二) MVC过滤器Filter .NET MVC全局异常处理(二) 对上节的内容进行了补充 MVC过滤器Filter MVC有四种过滤器:Authorization ...

  9. .NET MVC全局异常处理(一)

    目录 .NET MVC全局异常处理 IIS配置 静态错误页配置 .NET错误页配置 程序设置 全局异常配置 .NET MVC全局异常处理 一直知道有.NET有相关的配置,但没有实际做过,以为改下设定就 ...

随机推荐

  1. 【Azure Developer】使用Java代码启动Azure VM(虚拟机)

    问题描述 在使用Java的启动Azure VM的过程中,遇见了com.azure.core.management.exception.ManagementException: Status code ...

  2. Day16_95_IO_循环读取文件字节流read()方法(四)

    循环读取文件字节流read()方法(四) 使用 int read(byte[] bytes) 循环读取字节流数据 import java.io.FileInputStream; import java ...

  3. mongodb数据修复宝典

    mongodb数据修复宝典 1. 版本信息 mongodb版本: 3.6.14 2.mongodb日志内容: 2019-10-04T10:41:38.558+0000 E STORAGE [inita ...

  4. 解决mysql You can't specify target table for update in FROM clause错误

    mysql中You can't specify target table for update in FROM clause错误的意思是说,不能先select出同一表中的某些值,再update这个表( ...

  5. Java变量详解(变量定于及语法创建)

    变量的使用定义 变量用于操作系统中,实体之间的传递,把变量看作一个在内存空间中声明的存储位置,在调用变量的时候,系统会自动的调用内存中的存储位置. 在Java中,变量又称为字段,故字段在Java中又有 ...

  6. ASP调用SDK微信分享好友、朋友圈

    ASP调用SDK微信分享好友.朋友圈需要用到sha1.asp,我先来上主代码,然后再附加sha1.asp,方便大家直接复制过去即可使用. 页面:shara.asp 1 <%@LANGUAGE=& ...

  7. Pyqt5 combobox

    起因 combobox的使用和介绍 两个combobox 联动 开始 介绍 Combobox是Qt中的下拉复选框, 注意:在添加列表选项时,可以一个个添加,也可以直接使用列表一次性添加多个: 添加多个 ...

  8. 使用SSH端口做端口转发以及反向隧道

    目录 SSH做本地端口转发 SSH做反向隧道(远程端口转发) 用autossh建立稳定隧道 SSH开启端口转发需要修改 /etc/ssh/sshd_config配置文件,将 GatewayPorts修 ...

  9. Linux系统应急响应

    目录 排查用户相关的信息 排查进程端口相关的信息 查找恶意程序并杀掉 斩草除根 判断入侵方式,修复漏洞 当我们被告知一台Linux服务器被黑客入侵,黑客利用该服务器进行挖矿,并且在该服务器上放置了木马 ...

  10. 我的主站 SHARELIST -分享列表 (功能持续完善中 2019-11-24 版本0.3)

    网站地址: http://www.sharelist.link 网站地址二维码: 网站介绍和更新: http://106.13.105.156/sharelist.php?listid=5dbda96 ...