最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • php7异常与错误处理和自定义异常

    正文概述 转载于:掘金(程序员安安)   2021-07-21   712

    什么叫做异常?

    异常是指程序运行中不符合预期情况以及与正常流程不同的状况。

    比如你链接数据库,在参数都写上去的条件下,发现链接不上去,这就属于不符合预期

    可以被 try-catch 捕捉得到

    什么叫做错误?

    是属于php程序自身的问题,一般是由非法的语法,环境问题导致的,使得编译器无法通过检查,甚至无法运行的情况。
    平时遇到的 warming、notice都是错误,只是级别不同而已。

    例如:

    • TypeError(类型错误) 我规定的函数参数类型和传入的参数不一致
    • ArithmeticError (算数错误)
    • ParseError (解析错误)在调入的文件中,include "demo.php",或者 eval();中有语法错误造成解析失败
    • AssertionError(断言错误)当assert生效时产生该错误
    • DivisionByZeroError (分母为零) 运算过程中例如除法,分母为0

    除了这几种情况,其余全部为异常

    异常处理

    在以前的 php5.X 中 并且不能被 try-catch 捕捉得到,到了 php 7.x 中,定义了一个 Throwable 接口 并使得大部分的 Error 和
    Exception 实现了该接口,我们得以在 try-catch 中抛出该错误

    所以说以后想要捕获异常,而你又不知道此异常是 Error 还是 Exception 的话,可以向这样抛出

    try{
        ……
    }catch(Throwable $e){
        ……
    }
    

    错误的级别

    在 php 中的错误也是有级别的Parse error >Fatal Error > Waning > Notice > Deprecated

    Deprecated 最低级别的错误(不推荐,不建议)
    使用一些过期函数的时候会出现,程序继续执行
    
    Notice 通知级别的错误
    使用一些未定义变量、常量或者数组key没有加引号的时候会出现,程序继续执行
            E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.
            E_USER_NOTICE // 用户产生的通知信息。
            
    Waning 警告级别的错误
    程序出问题了,需要修改代码!!!程序继续执行
            E_WARNING         // 运行时警告 (非致命错误)。
            E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。
            E_COMPILE_WARNING // 编译警告
            E_USER_WARNING    // 用户产生的警告信息
            
    Fatal Error 错误级别的错误
    程序直接报错,需要修改代码!!!中断程序执行,可使用register_shutdown_function()函数在程序终止前触发一个函数
            E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本
            E_CORE_ERROR    // PHP启动时初始化过程中的致命错误
            E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
            E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
            
    Parse error 语法解析错误
    语法检查阶段报错,需要修改代码!!!中断程序执行,除了修改ini文件,将错误信息写到日志中,什么也做不了
            E_PARSE  //编译时的语法解析错误
    

    自定义错误处理程序

    有的时候,php 中自带的错误处理程序,并不能完全满足我们得需要,大部分时候,我们都需要手动重写异常处理。

    php 给我们提供了三个函数来帮助我们来处理,分别是

    set_error_handler()

    • 函数来托管错误处理程序,可自行定制错误的处理流程。
    • 如果此函数之前的代码发生错误,那么不会调用我们自定义的处理函数,因为还未注册
    • 设置此函数后 error_reporting() 将会失效
    • 以下级别的错误不能由用户定义的函数来处理: E_ERROR、 E_PARSE、 E_CORE_ERROR、 E_CORE_WARNING、 E_COMPILE_ERROR、 E_COMPILE_WARNING 该函数只能捕捉我们的 部分 Warning 和 Note 级别的错误

    set_exception_handler()

    • 用于没有被捕获的异常处理

    register_shutdown_function()

    • 作用:注册一个会在php中止时执行的函数
    • 捕获PHP的错误:Fatal Error、Parse Error等,这个方法是PHP脚本执行结束前最后一个调用的函数,比如脚本错误、die()、exit、异常、正常结束都会调用,
    • 如果拿来用错误处理的时候,需要配合error_get_last() 它能获取最后发生的错误。
    // 举例:
    register_shutdown_function('shutdown');
    
    function shutdown()
    {
        if ($error = error_get_last()) {
            var_dump($error);
        }
    }
    $name   //没写 ; 号
    

    执行结果
    Parse error: syntax error, unexpected ';' in /app/swoole/errorDemo.php on line 34
    Emmmmm 这不扯淡吗? 分明分明没有执行呢?

    其实原因使因为,程序执行前,我们 php 会先检查我们程序的语法问题,如果没有问题,我们才能执行我们的程序。

    我们上面的代码没用通过我们的语法检查,所以直接报错。

    那么问题来了? 我们在框架中的时候,为什么是框架都是框架给我们报错呢?

    框架的错误处理

    在框架中,其代码是通过一个入口文件来加载的。而我们php检测语法错误的时候,只检查我们的 index.php 有没有错误, require 文件中的代码是不会受到检测的。在Index.php 文件中通常会定义一些错误异常的处理。当我们代码出错时,那是在 run-time 中检测的错误,我们的框架可以根据我们编写的错误异常自行做出处理。

    下面我们举个例子 在 ThinkPHP5中的异常处理

    // [ 应用入口文件 ]  index.php
    namespace think;
    
    // 加载基础文件
    require __DIR__ . '/../thinkphp/base.php';
    
    // 支持事先使用静态方法设置Request对象和Config对象
    
    // 执行应用并响应
    Container::get('app')->run()->send();
    

    在我们的入口文件中,加载了 base.php 在这个文件中,TP 定义了自己的异常处理

    // 载入Loader类
    require __DIR__ . '/library/think/Loader.php';
    
    // 注册自动加载
    Loader::register();
    
    // 注册错误和异常处理机制
    Error::register();
    
    // 实现日志接口
    if (interface_exists('Psr\Log\LoggerInterface')) {
       //doSomething
    }
    
    // 注册类库别名
    Loader::addClassAlias([
       //doSomething
    ]);
    /**
         * 注册异常处理
         * @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']);
        }
    

    可以看到 TP是在入口脚本就注册了 异常处理机制,分别把 Error 、Exception、Shutdown的处理都注册进来。后序所有的异常都不会走PHP原本的异常而是走 TP 自定义的异常。

    以上内容希望帮助到大家,更多免费PHP大厂PDF,PHP进阶架构视频资料,PHP精彩好文可以微信搜索关注:PHP开源社区

    2021金三银四大厂面试真题集锦,必看!

    四年精华PHP技术文章整理合集——PHP框架篇

    四年精华PHP技术文合集——微服务架构篇

    四年精华PHP技术文合集——分布式架构篇

    四年精华PHP技术文合集——高并发场景篇

    四年精华PHP技术文章整理合集——数据库篇


    起源地下载网 » php7异常与错误处理和自定义异常

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元