Thinkphp8 配置异常全局捕捉处理

封装异常处理

配置

先创建自己的 BaseException 类
<?php

namespace app\exception;

use app\enums\StatusCodeEnum;

class BaseException extends \Exception
{
    public $success = false;
    public $status = 1;
    public $statusInfo = [
        "message" => "服务器正忙",
    ];
    // 这里是我自己设置的一个状态码类,StatusCodeEnum::INTERNAL_SERVER_ERROR = 500
    public $httpStatus = StatusCodeEnum::INTERNAL_SERVER_ERROR;
    public function __construct($message = "", $code = 0, $httpStatus = 500)
    {
        if (!is_numeric($code)) {
            $code = 0;
        }
        if (!is_numeric($httpStatus)) {
            $httpStatus = 500;
        }
        $this->httpStatus = $httpStatus;
        $this->status = $code;
        $this->statusInfo = [
            "message" => $message,
        ];
        parent::__construct($message, $code);
    }
    // 这里也可以写在公共方法中脱离出来
    public function getError()
    {
        return [
            "success" => $this->success,
            "status" => $this->status,
            "statusInfo" => $this->statusInfo,
        ];
    }
}

再写一个类进行继承这个类

没有需要不用修改任何东西,继承的父类已经够用了

<?php

namespace app\exception\AppException;

use app\exception\BaseException;
// 我这个是一个参数报错异常
class ParameterException extends BaseException
{

}

使用

在UserMiddle中间件中使用
<?php

namespace app\middleware;

// 以上代码省略。。。。。。

class UserMiddle
{

    public function handle($request, \Closure $next)
    {

        // 获取请求参数
        $params = $request->param();

        try {
            // 验证用户信息,指定验证类为UserValidate,验证场景为login,并检查参数是否通过验证
            validate(UserValidate::class)->scene("login")->check($params);
        } catch (ValidateException $e) {
            // 验证失败,抛出异常,返回错误信息
			// 在这里抛出我们自己配置的类,不写参数会有默认的参数
            throw new ParameterException($e->getMessage(), 1,500);
        }

        return $next($request);
    }
}
配置ExceptionHandle类异常处理
<?php
namespace app;

// 以上代码省略。。。。。。

/**
 * 应用异常处理类
 */
class ExceptionHandle extends Handle
{
    // 以上代码省略。。。。。。
    public function render($request, Throwable $e): Response
    {
        // 添加自定义异常处理机制,判断类型,自己可以灵活搭配
        if($e instanceof ParameterException){
            return json($e->getError(),$e->httpStatus);
        }

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

在这里插入图片描述


  • 11
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
thinkphp6中,异常处理是通过异常类来实现的。当系统出现异常时,会抛出一个异常对象,我们可以通过捕获这个异常对象来进行异常处理。以下是一个简单的异常处理示例: 1. 在控制器中抛出一个异常: ```php throw new \think\Exception('这是一个异常'); ``` 2. 在应用的异常处理类中进行异常处理: ```php namespace app\exception; use think\exception\Handle; use think\Response; use Throwable; class Http extends Handle { public function render($request, Throwable $e): Response { // 根据不同异常类型进行处理 if ($e instanceof \think\Exception) { // 返回错误信息 return json(['msg' => $e->getMessage()], 500); } // 其他异常交给系统处理 return parent::render($request, $e); } } ``` 注意,上面的代码中,我们继承了think\exception\Handle类,并重写了它的render方法。render方法接受两个参数:$request表示当前请求对象,$e表示抛出的异常对象。在这个方法中,我们可以根据不同的异常类型进行处理,并返回一个Response对象。如果我们不需要对异常进行特殊处理,可以直接调用父类的render方法,让系统进行默认的异常处理。 3. 在应用的配置文件中配置异常处理类: ```php return [ // 异常处理类 'exception_handle' => 'app\exception\Http', ]; ``` 在上面的配置中,我们将异常处理类设置为app\exception\Http。这样,在应用出现异常时,系统就会自动调用这个类的render方法进行异常处理。 除了上面的方法,thinkphp6还提供了其他的异常处理方式,比如使用自定义的异常类、使用异常监听器等。你可以根据自己的需求选择合适的方式进行异常处理
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值