一文讲解thinkphp5中是如何自定义全局异常
时间:2021-11-08
来源:互联网
标签:
今天PHP爱好者给大家带来下面thinkphp框架教程栏目将给大家讲解thinkphp5中是如何自定义全局异常,希望对需要的朋友有所帮助!
为了针对书写 api 时,对各种错误返回不通的 json ,直接使用 TP5 自带的提示错误页面,对于客户端而言,明显没有任何的作用,所以需要自己来自定义全局异常。
1.创建一个全局异常的类(用于传错误信息,状态码等)
use think\Exception;
class BaseException extends Exception {
/** HTTP 状态码
* @var string
*/
public $code;
/** 自定义错误码
* @var string
*/
public $errorCode;
/** 错误信息
* @var string
*/
public $msg;
public function __construct($params=[])
{
if (! $params) {
return ;
}
// 如果传了 code
if ($array_key_exists('code', $code) {
$this->code = $code;
}
// 如果传了 errorCode
if (array_key_exists('errorCode', $params)) {
$this->errorCode = $params['errorCode'];
}
// 如果传了 msg
if (array_key_exists('msg', $params)) {
$this->msg = $params['msg'];
}
}
}
这样就可以给以传不通的状态码,错误信息和自定义错误码。
2. 创建一个错误处理类
错误处理类,继承于TP5自带的错误处理类,重写该 render 方法,就可以自定义错误。
use Exception;
use think\exception\Handle;
use think\Request;
class ExceptionHandle extends Handle
{
/** 状态码
* @var
*/
private $code;
/** 自定义错误码
* @var
*/
private $errorCode;
/** 错误信息
* @var
*/
private $msg;
/** 重写 Handle 方法里的Render
* @param Exception $e
* @return \think\response\Json
*/
// 注意这里是基类 Exception
public function render(Exception $e)
{
if ($e instanceof BaseException) {
//如果是自定义异常,则控制http状态码,不需要记录日志
//因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
//不应当记录日志
$this->msg = $e->msg;
$this->code = $e->code;
$this->errorCode = $e->errorCode;
} else {
// 如果是服务器未处理的异常,将http状态码设置为500,并记录日志
if (config('app_debug')) {
// 调试状态下需要显示TP默认的异常页面,因为TP的默认页面
// 很容易看出问题
return parent::render($e);
}
$this->code = 500;
$this->msg = '服务器内部错误,不想告诉你';
$this->errorCode = 999;
$this->recordErrorLog($e);
}
$request = Request::instance();
$result = [
'msg' => $this->msg,
'errorCode' => $this->errorCode,
'request_url' => $request->url()
];
return json($result, $this->code);
}
/** 错误日志处理
* 这里把config里日志配置的type改为test
* @param Exception $e
*/
private function recordErrorLog(Exception $e)
{
// 开启日志
Log::init([
'type' => 'File',
'path' => LOG_PATH,
'level' => ['error']
]);
// 日志记录方法
Log::record($e->getMessage(),'error');
}
}
3.修改配置config
// 异常处理handle类 留空使用 \think\exception\Handle
'exception_handle' => 'app\lib\exception\ExceptionHandle',
// 关闭日志
'log' => [
// 日志记录方式,内置 file socket 支持扩展
// 关闭自动记录日志,请将type设置为test
'type' => 'test',
// 日志保存目录
'path' => __DIR__.'/../log/',
// 日志记录级别
'level' => ['sql'],
],
4.使用错误类的方法
// 这里随便创建一个userControlelr
class UserController extends Controller {
use app\api\model\User;
/**
* 根据 id 获取某个用户
*/
public function getUser($id)
{
$user = User::get($id);
// 如果 $user 为空 抛出自定义的错误,下面有...
if(! $user) {
throw UserMissException();
}
return json($user);
}
}
自定义的错误子类
// 上面第一节,写的 Base 错误类派上用场了。
class UserMissException extends BaseException
{
/** HTTP 状态码
* @var string
*/
public $code = '404';
/** 自定义错误码
* @var string
*/
public $errorCode = '40000';
/** 错误信息
* @var string
*/
public $msg = '请求的用户不存在';
}
请求这个 getUser 方法,报错~ 就会显示
{
"msg": "请求的用户不存在",
"errorCode": "40000",
"request_url": "/api/v1/user/10"
}
其他的错误类型,也就可以继续创建异常子类,定义这些错误属性。
5.总结
不光是在TP5的框架,包括laravel框架,也是可以自己重新写异常类Exception的render方法,来达到自己想要的错误返回数据或者是页面模版。
以上就是一文讲解thinkphp5中是如何自定义全局异常的详细内容,更多请关注php爱好者其它相关文章!
-
USB Host接口有什么用?USB Host和USB Device接口的区别 时间:2025-12-16 -
HDMI怎么区分1.4和2.0?HDMI1.4和2.0的区别 时间:2025-12-16 -
com.android.phone已停止运行是什么意思?怎么解决? 时间:2025-12-16 -
4mp摄像头是多少像素?4mp和1080p有什么区别? 时间:2025-12-16 -
电脑出现normal.dotm错误怎么办?解决方法是什么? 时间:2025-12-15 -
normal.dotm在哪个文件夹里 如何删除normal模板 时间:2025-12-15
今日更新
-
战网国际服如何快速找回账号-战网国际服账号找回详细教程
阅读:18
-
欧易新用户专属福利:注册即享多重好礼与优惠
阅读:18
-
黄漫免费漫画入口风险警示-黄漫免费漫画入口安全访问指南
阅读:18
-
碰碰车是什么梗指网络流行语中形容人际关系碰撞或搞笑互动,源自游乐场碰碰车娱乐项目。
阅读:18
-
chess online官网登录入口-chess online网站快捷登录入口
阅读:18
-
欧易邀请好友奖励机制详解 如何获得高额返利
阅读:18
-
哔哩哔哩官网网页直播回放观看入口-哔哩哔哩官网网页快捷入口
阅读:18
-
云原神网页版登录入口位置详解
阅读:18
-
ps5港服官网入口地址-ps5港版注册登录通道
阅读:18
-
批作业是什么梗?揭秘学生党崩溃瞬间,看完笑出眼泪!
阅读:18










