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);
}