thinkphp6的自定义异常处理-程序员宅基地

技术标签: exception  laravel  java  django  thinkphp  

框架支持异常处理由开发者自定义类进行接管,需要在app目录下面的provider.php文件中绑定异常处理类,例如:

<?php
use app\ExceptionHandle;
use app\Request;

// 容器Provider定义文件
return [
    'think\Request'          => Request::class,
//    'think\exception\Handle' => ExceptionHandle::class,//原来的异常
    'think\exception\Handle' => '\\app\\exception\\ExecptionHandle'
];

然后再app下面新建一个exception文件夹放自定义错误信息

<?php
/**
 *
 * User: 小贝壳
 * Date: 2022/2/27
 **/

namespace app\exception;

use think\facade\Env;
use think\exception\Handle;
use app\exception\HttpExceptions;
use think\Response;
use Throwable;

class ExecptionHandle extends Handle
{
    private $msg = "未知错误";
    private $httpCode = 500;
    private $errorCode = 19999;

    public function render($request, Throwable $e): Response
    {
        //判断在`.env`里面是否开始了调试,开启了调试就原样返回,关闭了调试就返回自定义的json格式的错误信息
        if(Env::get("APP_DEBUG") == 1){
            return parent::render($request,$e);
        }
        $this->msg = $e->getMessage() ?: $this->msg;
        //HttpExceptions是继承同级目录下HttpExceptions,代码在下方
        if ($e instanceof HttpExceptions) {
            $this->httpCode = $e->getStatusCode() ?: $this->httpCode;
        }
        $this->errorCode = $e->getCode() ?: $this->errorCode;
        $result_data = [
            'message' => $this->msg,
            'data' => [],
            'code' => $this->errorCode
        ];
        return json($result_data, $this->httpCode);

        // 其他错误交给系统处理
        return parent::render($request, $e);
    }

}

同级目录下HttpExceptions 文件

<?php
/**
 *
 * User: 小贝壳
 * Date: 2022/2/27
 * Time: 1:42
 **/

namespace app\exception;

use Exception;

class HttpExceptions extends \RuntimeException
{
    private $statusCode;
    private $headers;
    //主要是重构$code前提,$previous和 $headers在后面方便调用
    public function __construct(int $statusCode, string $message = '', $code = 0, Exception $previous = null, array $headers = [])
    {
        $this->statusCode = $statusCode;
        $this->headers    = $headers;

        parent::__construct($message, $code, $previous);
    }

    public function getStatusCode()
    {
        return $this->statusCode;
    }

    public function getHeaders()
    {
        return $this->headers;
    }
}

调用

use app\exception\HttpExceptions;
throw new HttpExceptions(404,"自定义错误",'444');
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44694538/article/details/123161900

智能推荐

窗口无故失去焦点解决方案_pb 窗口 失去焦点事件-程序员宅基地

文章浏览阅读5k次,点赞3次,收藏4次。 首先确定是哪个应用进程抢占了焦点。这里用如下的软件 这个软件能自动识别是哪个进程抢占了焦点, 1.若是句柄值在两个之间变化的直接定位到相应句柄值,使用如下软件 输入对应句柄值,强制关闭即可。 2.若句柄值实时变化的话 ,记住标题名,如我是碰到这种 然后输入: ..._pb 窗口 失去焦点事件

获取数据库连接的三种方式(已经注册驱动)_condition 获取数据库驱动-程序员宅基地

文章浏览阅读8.9w次。1:Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/exam", "root", "321");2:Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/exam?user=_condition 获取数据库驱动

运维工程师如何成为网络安全网盾工程师-程序员宅基地

文章浏览阅读838次,点赞15次,收藏23次。基础运维工程师的出路就是逐渐偏向网络安全运维工程师,也就是网盾工程师。伴随着互联网的产生和发展,网络安全问题层出不穷,各式各样安全漏洞的涌现,运维与安全这两个专业日渐交融,人们对运维安全的重视程度越来越高,出现了一个新的交叉领域叫“运维安全”。黑客、白帽子忙于挖掘运维安全漏洞,企业忙于构建运维安全体系,一时间无数漏洞纷至沓来,座座堡垒拔地而起。现实中的业务、运维、安全的关系是互相关联、彼此依赖的。从这张图中,衍生出三个不同与安全相关的子专业:“运维+安全”,“安全+运维”,“业务+运维+安全”。

wps在Ubuntu下可以中文输入的方法_ubuntu下wps输入中文乱码-程序员宅基地

文章浏览阅读476次。解决办法当大家在Ubuntu下安装wps后,打开wps软件,却发现自己无法使用搜狗输入法进行中文编辑,让人很是头疼,这是为什么那?这主要是因为wps三个文件部分需要更改,主要如下:/usr/bin/wps/usr/bin/et/usr/bin/wpp使用vim编辑(需要sudo权限),文件开头那里原本是这样#!/bin/bashgOpt=#gOptExt=-multi..._ubuntu下wps输入中文乱码

计算机幂函数xn,幂函数-程序员宅基地

文章浏览阅读1.2k次。数值的整数次方2021-04-18 18:33:31实现pow(x,n),即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题【模板】多项式幂函数 (加强版)2021-04-01 20:05:06VII.【模板】多项式幂函数 (加强版)可以看到这题与上题的唯一区别就是\(a_0\)的取值。因为我们之前在\(\ln\)的时候,是要求\(a_0=1\)的;而这题不保证..._科学计算机的幂函数

linux 查看已安装软件_linux查询已安装软件 openkylin-程序员宅基地

文章浏览阅读2.4w次,点赞7次,收藏71次。接触新的环境新的项目需要先了解当前环境下安装了哪些东西一、查看系统配置文件(检查已安装的软件)一些核心软件需要配置环境变量,less /etc/profile 查看(按G查看文件末尾的export)找export配置的理路径二、查看网络运作情况(检查已部署的应用)一些服务和应用是不会配置环境变量,需要通过其它额外的手段检测,可以有以下两种方式:  1、查看此机器上所有服务和应用运作情况:netstat -anp  从结果可以看出,目前已经安装并启动svn、mysql、nginx服务和一些j_linux查询已安装软件 openkylin

随便推点

MQTT产品对比_.net mqtt 开源 对比-程序员宅基地

文章浏览阅读2.7k次。常见MQTT产品对比https://github.com/mqtt/mqtt.github.io/wiki/servershttps://github.com/mqtt/mqtt.github.io/wiki/server-supportServer QoS 0 QoS 1 QoS 2 auth bridge $SYS SSL dy..._.net mqtt 开源 对比

js书写移动端常用事件_js 移动端 手写事件-程序员宅基地

文章浏览阅读554次。 移动端的事件是新增的,叫“touch”事件 触摸事件。click点击事件依然支持,会有300ms的延迟touchstart, tap, click的加载快慢顺序touchstart &gt; tap &gt; click 开始触摸 :touchstart触摸移动:touchmove触摸结束:touchend 事件对象获取手指按下的位置在touchs..._js 移动端 手写事件

soapui怎么设置中文_小米手机怎么弄抖音中文数字时钟罗盘屏保 设置动态壁纸教程...-程序员宅基地

文章浏览阅读547次。[闽南网]最近抖音上有一个中文数字时钟罗盘非常火爆,这种文字罗盘锁屏特效十分高大上,受到了不少抖友们的青睐。但是,罗盘文字时钟每种手机款型的不一样设置方法也是不同,可能很多米粉也想设置中文数字时钟罗盘锁屏特效。下面小编给大家带来了小米手机中文数字时钟罗盘动态壁纸的设置教程,不妨一起来看看吧。目前安卓手机只有OPPO和vivo主题商店有这款文字时钟主题下载,但OPPO和vivo的主题商店安装包并不适..._soapui设置成中文

GitHub:用户名或密码无效_password cannot include your login-程序员宅基地

文章浏览阅读7.3k次。I have a project hosted on GitHub. 我有一个在GitHub上托管的项目。 I fail when trying to push my modifications o_password cannot include your login

SPI FLASH的dummy指的是什么?_flash dummy-程序员宅基地

文章浏览阅读4.9k次,点赞2次,收藏6次。A0~A23:flash内部存储器地址;M0~M7:制造商ID;ID0~ID15:flash芯片ID;D0~D7:flash内部存储的数据;dummy:指任意数据。_flash dummy

C语言-队列_c语言队列-程序员宅基地

该文章介绍了队列的特性和操作,队列是一种特殊的线性表,只允许在前端删除、后端插入,具有先进先出的特点。同时,还提到了对队列大小和尾指针的更新操作。

推荐文章

热门文章

相关标签