ThinkPHP 全局异常处理
Posted wqy的笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ThinkPHP 全局异常处理相关的知识,希望对你有一定的参考价值。
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 查看
namespace app;
use app\\common\\ApiErrCode;
use app\\common\\exception\\BaseException;
use app\\common\\response\\JsonResponse;
use think\\db\\exception\\DataNotFoundException;
use think\\db\\exception\\ModelNotFoundException;
use think\\exception\\Handle;
use think\\exception\\HttpException;
use think\\exception\\HttpResponseException;
use think\\exception\\ValidateException;
use think\\Response;
use Throwable;
/**
* 应用异常处理类
*/
class ExceptionHandle extends Handle
{
use JsonResponse;
/**
* 不需要记录信息(日志)的异常类列表
* @var array
*/
protected $ignoreReport = [
HttpException::class,
HttpResponseException::class,
ModelNotFoundException::class,
DataNotFoundException::class,
ValidateException::class,
];
/**
* 记录异常信息(包括日志或者其它方式记录)
*
* @access public
* @param Throwable $exception
* @return void
*
*/
public function report(Throwable $exception): void
{
// 使用内置的方式记录异常日志
parent::report($exception);
}
/**
* Render an exception into an HTTP response.
* @access public
* @param \\think\\Request $request
* @param Throwable $e
* @return Response
*/
public function render($request, Throwable $e): Response
{
// 其他错误交给系统处理
// return parent::render($request, $e);
// 添加自定义异常处理机制
if($e instanceof BaseException){
$code = $e->getCode();
$message = $e->getMessage();
}else{
$code = $e->getCode();
if(!$code || $code < 0){
$code = ApiErrCode::unknown_err[\'code\'];
}
$message = $e->getMessage() ? : ApiErrCode::unknown_err[\'msg\'];
}
return $this->jsonData($code,$message);
}
}
下面来看 BaseException ,这里表示基础异常类
其中 ApiErrCode 是定义的 错误码类 可以去 http://www.upwqy.com/details/216.html 查看
namespace app\\common\\exception;
use app\\common\\ApiErrCode;
use think\\Exception;
/**
* 基础异常
* @user yiqiu
* @email 529857614@qq.com
* @date 2021/2/19 20:45
* @blog http://www.upwqy.com
*/
class BaseException extends \\Exception
{
protected $code = ApiErrCode::unknown_err[\'code\'];
protected $message = ApiErrCode::unknown_err[\'msg\'];
public function __construct($params = [])
{
if(is_array($params) ){
if(isset($params[\'code\']) && $params[\'code\']){
$this->code = $params[\'code\'];
}
if(isset($params[\'msg\']) && $params[\'msg\']){
$this->message = $params[\'msg\'];
}
}else if(is_string($params)){
$this->message = $params;
}
parent::__construct($this->message, $this->code);
}
}
然后我们可以自定义一些异常类 ,比如下面的 ParameterException.php 表示参数异常时的处理
namespace app\\common\\exception;
use app\\common\\ApiErrCode;
class ParameterException extends BaseException
{
protected $code = ApiErrCode::invalid_params[\'code\'];
protected $message = ApiErrCode::invalid_params[\'msg\'];
}
实例:
$user = User::where(\'id\',1)->find();
if(!$user){
throw new ParameterException(\'用户不存在\');
}
当需要指定的异常,直接 使用 throw new ParameterException(\'用户不存在\'); 即可,返回结果如下,并且可以在任何地方使用
{
"code": 204,
"msg": "用户不存在",
"data": "",
"timestamp": 1622604524
}
THinkPHP5
在tp5框架中,我们需要手动创建应用异常处理类。ExceptionHandler.php
并且在配置中 修改配置
\'exception_handle\' => \'api\\lib\\exception\\ExceptionHandler\',
以上是关于ThinkPHP 全局异常处理的主要内容,如果未能解决你的问题,请参考以下文章