avatar

mdo

Hello

  • 首页
  • 知识库
  • 归档
  • 标签
  • 关于
主页 ThinkPHP5之自定义全局异常
文章

ThinkPHP5之自定义全局异常

发表于 2025-12-3 更新于 2025-12- 3
作者 mdo
8~10 分钟 阅读

为了针对书写 api 时,对各种错误返回不通的 json ,直接使用 TP5 自带的提示错误页面,对于客户端而言,明显没有任何的作用,所以需要自己来自定义全局异常。

1.创建一个全局异常的类(用于传错误信息,状态码等)
use think\Exception;
class BaseException extends Exception {

     * @var string
     */
    public $code;


     * @var string
     */
    public $errorCode;


     * @var string
     */
    public $msg;

    public function __construct($params=[])
    {
        if (! $params) {
            return ;
        }


        if ($array_key_exists('code', $code) {
            $this->code = $code;
        }


        if (array_key_exists('errorCode', $params)) {
            $this->errorCode = $params['errorCode'];
        }


        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;


     * @param Exception $e
     * @return \think\response\Json
     */

    public function render(Exception $e) 
    {
        if ($e instanceof BaseException) {




            $this->msg = $e->msg;
            $this->code = $e->code;
            $this->errorCode = $e->errorCode;
        } else {

            if (config('app_debug')) {


                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
    'exception_handle'       => 'app\lib\exception\ExceptionHandle',


'log'                    => [


        'type'  => 'test',

        'path'  => __DIR__.'/../log/',

        'level' => ['sql'],
    ],
4.使用错误类的方法
class UserController extends Controller {

    use app\api\model\User;


    * 根据 id 获取某个用户
    */
    public function getUser($id)
    {
        $user = User::get($id);


        if(! $user) {
            throw UserMissException();
        }

        return json($user);
    }
}

自定义的错误子类

class UserMissException extends BaseException
{

     * @var string
     */
    public $code = '404';


     * @var string
     */
    public $errorCode = '40000';


     * @var string
     */
    public $msg = '请求的用户不存在';
}

请求这个 getUser 方法,报错~ 就会显示

{
    "msg": "请求的用户不存在",
    "errorCode": "40000",
    "request_url": "/api/v1/user/10"
}

其他的错误类型,也就可以继续创建异常子类,定义这些错误属性。

知识库
异常 ThinkPHP5 全局
许可协议:  CC BY 4.0
分享

相关文章

10月 7, 2026

比尔盖茨的智慧:想多赚钱,就每天循环做这3件事

我们总有一种非常固执的错觉,认为那些站在财富金字塔顶端的人,必然拥有某种超越常人的特异功能。我们在脑海中给比尔盖茨这样的大佬描绘了一幅极其悲壮的奋斗画像。大家总觉得,他之所以能富可敌国,肯定是因为他每天只睡三个小时,同时对着八个电脑屏幕疯狂敲击键盘,每一秒钟都在做出价值几亿美金的生死抉择。 为了模仿

9月 28, 2026

程序员越想创业,越不要急着动手

一个能源方面的前辈找到我,希望通过我把一些人工的工作 AI 自动化。 能源方面我不懂,找 Gemini 聊完发现这个是可以复制的,非常兴奋。我跟老婆说,这个项目做好以后可以做成平台,推广到其他公司,你就等着做总裁夫人吧! 她听完以后跟我说,这个项目还是太定制化,和我之前做的一个项目很像。 那个项目一

9月 25, 2026

忍了一年多,我终于对i18n下手了过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道

前言 大家好,我是奈德丽。 过去一年,我主要参与国际机票业务的开发工作,因此每天都要和多语言(i18n)打交道。熟悉我的朋友都知道,我这个人比较“惜力”(并不是,实际上只是忍不下去了),对于重复笨拙的工作非常抵触,于是,我开始思考如何优化团队的多语言管理模式。 痛点背景 先说说我们在机票项目中遇到的

下一篇

thinkphp 统一结果返回处理类

上一篇

10款适用于Mac的最佳录音软件

最近更新

  • 比尔盖茨的智慧:想多赚钱,就每天循环做这3件事
  • iOS 侧载(Sideloading)工具
  • 程序员越想创业,越不要急着动手
  • 注册 Chat Participant
  • 中秋给在外游子的一封信

热门标签

API CodeGeex Coding Cursor DeepSeek Docker Gitkraken Harness Laravel Management

目录

©2026 mdo. 保留部分权利。