Thinkphp5.1 全局异常处理
小小封装一下异常抛出类~#
1. 封装统一返回类#
<?php
/**
* @author carver
* @date 2021/10/14 10:06
*/
namespace app\utils;
use JsonSerializable;
/**
* 返回结果封装
* Class Result
* @package app\utils
*/
class Result implements JsonSerializable {
private $code;
private $msg;
private $data;
/**
* Result constructor.
* @param int $code
* @param string $msg
* @param string $data
*/
public function __construct($code = 0, $msg = "success", $data = "") {
$this->code = $code;
$this->msg = $msg;
$this->data = $data;
}
/**
* 成功返回结果
* @param string $data 返回数据
* @return Result
* @author carver
* @date 2021/10/14 10:36
*/
public static function ok($data = "") {
return new self(0, "success", $data);
}
/**
* 失败返回结果
* @param array $businessStatus BusinessStatus枚举值
* @param string $data 返回数据
* @return Result
* @author carver
* @date 2021/10/14 10:34
*/
public static function fail($businessStatus, $data = "") {
return new self($businessStatus[0], $businessStatus[1], $data);
}
public function __toString() {
return json_encode($this);
}
/**
* @return int
*/
public function getCode() {
return $this->code;
}
/**
* @param int $code
*/
public function setCode($code) {
$this->code = $code;
}
/**
* @return string
*/
public function getMsg() {
return $this->msg;
}
/**
* @param string $msg
*/
public function setMsg($msg) {
$this->msg = $msg;
}
/**
* @return string
*/
public function getData() {
return $this->data;
}
/**
* @param string $data
*/
public function setData($data) {
$this->data = $data;
}
/**
* 重写jsonSerialize
* @return array|mixed
* @author carver
* @date 2021/11/21 9:58
*/
public function jsonSerialize() {
return [
"code" => $this->getCode(),
"msg" => $this->getMsg(),
"data" => $this->getData(),
];
}
}
2. 封装业务异常状态#
<?php
/**
* 业务异常状态
* @author carver
* @date 2021/10/14 10:14
*/
namespace app\exception;
class BusinessStatus {
/**
* 成功,一切正常
*/
const SUCCESS = [0, "success"];
/**
* 未登录或登录已过期,请重新登陆
*/
const NOT_LOGIN = [401, "未登录或登录已过期,请重新登陆"];
/**
* 服务器错误
*/
const UNKNOW_ERROR = [500, "服务器未知错误"];
}
3. 编写业务异常#
<?php
/**
* 业务异常
* @author carver
* @date 2021/10/14 9:14
*/
namespace app\exception;
use Exception;
class BusinessException extends Exception {
/**
* 异常数据信息
* @var object|string
*/
private $errData;
/**
* BusinessException constructor.
* @param array $businessStatus 异常状态及提示
* @param object $data 异常数据信息
*/
public function __construct($businessStatus, $data) {
$this->errData = $data ? $data : "";
parent::__construct($businessStatus[1], $businessStatus[0]);
}
/**
* 获取异常数据
* @return object|string
*/
public function getErrData() {
return $this->errData;
}
}
4. 编写全局异常处理#
自定义异常处理类需要继承think\exception\Handle并且实现render方法
<?php
/**
* 全局异常处理
* @author carver
* @date 2021/10/14 11:10
*/
namespace app\exception;
use Exception;
use app\utils\Result;
use think\exception\Handle;
use think\facade\Config;
class BusinessExceptionHandler extends Handle {
public function render(Exception $exception) {
if ($exception instanceof BusinessException) {
$data = new Result($exception->getCode(), $exception->getMessage(), $exception->getErrData());
return json($data, 200);
} else if ($exception instanceof Exception) {
$debugStatus = Config::get("app_debug");
//开启debug状态,则非业务异常时会将trace信息放入data
$errorData = $debugStatus ? $exception->getTrace() : '';
$data = Result::fail(BusinessStatus::UNKNOW_ERROR, $errorData);
$data->setMsg($exception->getMessage());
return json($data, 200);
}
return parent::render($exception);
}
}
5. 修改配置项#
<?php
return [
//...
// 默认输出类型
'default_return_type' => 'json',
//...
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => "\\app\\exception\\BusinessExceptionHandler",
];
6. 测试#
<?php
namespace app\index\controller;
use app\exception\BusinessStatus;
use app\exception\BusinessException;
use app\utils\Result;
class Index {
public function index() {
echo "Hello,Thinkphp5.1";
}
public function exception() {
//业务逻辑
throw new BusinessException(BusinessStatus::NOT_LOGIN, ["key" => "val",]);
}
public function result() {
//业务逻辑
return Result::ok();
}
}
作者:Carver-大脸猫
出处:https://www.cnblogs.com/carver/articles/16633299.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
转载请注明原处
本文来自博客园,作者:Carver-大脸猫,转载请注明原文链接:https://www.cnblogs.com/carver/articles/16633299.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现