Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 606|回复: 0

ThinkPHP5.0源码学习之注册错误和异常处理机制

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-8-29 10:02:21 | 显示全部楼层 |阅读模式
    在base.php文件中,用一句代码\think\Error::register();实现错误和异常处理机制的注册。
    // 注册错误和异常处理机制
    \think\Error::register();
     
    打开library/think/Error.php,register函数如下:
    /**
    * 注册异常处理
    * @access public
    * @return void
    */
    public static function register()
    {
        error_reporting(E_ALL);                                 // 设置错误级别
        set_error_handler([__CLASS__, 'appError']);             // 设置错误处理方式
        set_exception_handler([__CLASS__, 'appException']);     // 设置异常处理
        register_shutdown_function([__CLASS__, 'appShutdown']); // 注册关闭函数
    }
    注:set_error_handler("myError") 、set_exception_handler("myException")、register_shutdown_function("myShutdown")不仅可以接受函数,还可以接受类的方法(公开的静态方法及公开的非静态方法),但需要以数组形式传递,数组的第一个值为“类名”,第二个值为“方法名”。
     
    1、error_reporting()
    error_reporting() 函数设置当前脚本的错误报告级别,规定报告哪种错误。E_ALL为显示所有的错误和警告信息,类似的级别还有E_ERROR—运行时致命的错误、E_WARNING—运行时非致命的错误、E_NOTICE-—运行时的通知。
     
    2、set_error_handler()
    set_error_handler指定appError来处理系统错误,捕获错误后把错误以异常的形式抛出。当程序出现错误的时候自动调用appError函数,该函数实例化了一个PHP自带的错误异常类ErrorException,如果符合异常处理的,就将错误信息以异常的形式抛出来,否则将错误信息写入日志中。
     
    3、set_exception_handler()
    set_exception_handler指定appException来处理用户抛出的异常,如果不是异常,就实例化ThrowableError类,将异常包装起来并抛出。
     
    4、register_shutdown_function()
    register_shutdown_function指定appShutdown处理超时异常。
     
    到此,框架的错误和异常处理机制就注册完了。
     
    在注册错误和异常处理机制中,都是使用getExceptionHandler方法来获取异常处理的实例。
    /**
    * 获取异常处理的实例
    * @access public
    * @return Handle
    */
    public static function getExceptionHandler()
    {
        static $handle;
     
        if (!$handle) {
            // 异常处理 handle
            $class = Config::get('exception_handle');
     
            if ($class && is_string($class) && class_exists($class) &&
                is_subclass_of($class, "\\think\\exception\\Handle")
            ) {
                $handle = new $class;
            } else {
                $handle = new Handle;
     
                if ($class instanceof \Closure) {
                    $handle->setRender($class);
                }
     
            }
        }
     
        return $handle;
    }
    可以看到 $class = Config::get('exception_handle'); 这句代码,也就是可以通过修改配置参数来指定新的异常处理对象。
    如果想使用自定义的错误和异常处理机制,首先在application/config.php文件中找到exception_handle的配置:
    // 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle'       => '',
    指错误信息来自于\think\exception\Handle的方法,将其改为自己定义的Exception类:
    // 异常处理handle类 留空使用 \think\exception\Handle
    'exception_handle'       => 'thinkphp\library\exception\ExceptionHandler',
    再按照配置新建文件,为thinkphp\library\exception\ExceptionHandler.php,重写这个Handle方法即可:
    class ExceptionHandler extends Handle
    {
        public function render(Exception $e)
        {
            return json('这里是自定义的错误');
            //return parent::render($e); // TODO: Change the autogenerated stub
        }
    }
    这样就可以使用自定义的错误和异常处理机制了。
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-29 23:18 , Processed in 0.075108 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表