thinkphp 以自定义格式抛出异常

601 阅读1分钟

1、在项目 common 下建立 exception 目录

2、在 exception 下建立 BaseException 类

<?php
/**
 * 自定义异常处理基类
 */

namespace app\common\exception;

use Exception;

class BaseException extends Exception
{
    public $code;
    public $msg;
    public $data;

    public function __construct($msg = 'unknow exception', $code = 6666, $data = null)
    {
        // 此处赋值是为了能在自定义异常处理时可以在 render 中读取
        $this->code = $code;
        $this->msg = $msg;
        $this->data = $data;

        parent::__construct($msg, $code);
    }
}

3、新建一个 JsonExceptionHandler 类,用于 以 json 格式输出异常

<?php
/**
 * 自定义异常处理,以 json 格式抛出异常
 */

namespace app\common\exception;

// thinkphp5.x
use Exception;
use think\exception\Handle;

class ExceptionHandler extends Handle
{
    public function render(Exception $e)
    {
        if ($e instanceof LemonException) {
            return json([
                'code' => $e->code,
                'msg' => $e->msg,
                'data' => $e->data
            ]);
        } else {
            // 没有指定自定义异常处理时,显示调用框架自带的异常
            return parent::render($e);
        }
    }
}

// thinkphp6.x
use think\exception\Handle;
use think\Response;
use Throwable;

class JsonExceptionHandler extends Handle
{
    public function render($request, Throwable $e): Response
    {
        if ($e instanceof BaseLemonException) {
            return json([
                'code' => $e->code,
                'msg' => $e->msg,
                'data' => $e->data
            ]);
        } else {
            // 没有指定自定义异常处理时,调用框架自带的异常进行相关处理
            return parent::render($request, $e);
        }

    }
}

4、将 JsonExceptionHandler 设为默认异常处理

// thinkphp5.x
/*
在 config/app.php 中将 'exception_handle' 设为 '\app\common\exception\JsonExceptionHandler'
*/

// thinkphp6.x
/*
在 app/provider 中,use app\common\exception;
然后,将默认的 'think\exception\Handle' => ExceptionHandle::class 更改为 'think\exception\Handle' => exception\JsonExceptionHandler::class,
*/

5、使用自定义 json 抛出异常

// 方法中直接用 throw 调用
use app\common\exception\BaseLemonException;
throw new BaseException('异常消息',404)
    
// 在 common.php 中将其设为公共函数,在需要以 json 格式抛出异常时直接调用该函数即可
/**
 * 以 json 格式抛出自定义异常
 * @param string $msg 异常提示信息
 * @param int $code 异常业务代码
 * @param string $data 异常提示数据
 * @throws \app\common\lemonException\BaseLemonException
 */
function lemonException(string $msg = '网络走丢了~', int $code = 6666, $data = '数据迷路了~')
{
    throw new \app\common\lemonException\BaseLemonException($msg,$code,$data);
}