• 2018/05/02 PHP 之错误与异常处理


    在学习中,越学习越觉得自己基础薄弱。

    在平常工作中,对于某些错误处理感觉不知道怎么下手,于是决定重新再整理一下。

    强烈推荐这篇文章,真的感觉学习到了很多。

    部分引用::再谈PHP错误与异常处理

    --

    1、在 PHP 中,什么是错误和异常处理?

    在我的理解中。

      只要是不符合程序预期的执行计划,都是异常。

      属于编写的问题,导致编译器无法通过编译。或者其他。是不能由 try-cache 捕捉的。

    我的理解真的很浅,上面文章对这方面讲解的很详细。

    --

    2、错误的级别

    这个问题引出了我今天为什么要重新学习错误和异常处理的原因。

    bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )
    
    产生一个用户级别的 error/warning/notice 信息
    

    这个函数引出了错误级别的概念,我当时在想,什么是用户级别的错误?

    这里引出了错误级别的分类,先看看有哪些错误级别吧

    Fatal Error:致命错误(脚本终止运行)
            E_ERROR         // 致命的运行错误,错误无法恢复,暂停执行脚本
            E_CORE_ERROR    // PHP启动时初始化过程中的致命错误
            E_COMPILE_ERROR // 编译时致命性错,就像由Zend脚本引擎生成了一个E_ERROR
            E_USER_ERROR    // 自定义错误消息。像用PHP函数trigger_error(错误类型设置为:E_USER_ERROR)
    
        Parse Error:编译时解析错误,语法错误(脚本终止运行)
            E_PARSE  //编译时的语法解析错误
    
        Warning Error:警告错误(仅给出提示信息,脚本不终止运行)
            E_WARNING         // 运行时警告 (非致命错误)。
            E_CORE_WARNING    // PHP初始化启动过程中发生的警告 (非致命错误) 。
            E_COMPILE_WARNING // 编译警告
            E_USER_WARNING    // 用户产生的警告信息
    
        Notice Error:通知错误(仅给出通知信息,脚本不终止运行)
            E_NOTICE      // 运行时通知。表示脚本遇到可能会表现为错误的情况.
            E_USER_NOTICE // 用户产生的通知信息。
    

    这些报错信息均会在 log 中体现,这也就体现了我上面的问题。

    什么是用户级别的报错信息。

    就是用户自定义了一个致命错误。

    知道这些的话,我们也就可以继续往下走了。

    --

    3、PHP异常处理函数

    这里也是学习和记录。

    一:set_error_handler()

      看一下官方对于他的解释:设置用户自定义的错误处理函数

      也很好理解吧,就是定义一个在发生错误处理的函数

    mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] )
    

      但是注意:该函数只能捕获系统产生的一些Warning、Notice级别的错误。

    二:register_shutdown_function()

      看一下官方对于他的解释:  注册一个会在php中止时执行的函数

      这个也从字面就可以理解,就是在 php 中止时调用的函数

    void register_shutdown_function ( callable $callback [, mixed $parameter [, mixed $... ]] )
    

      但是注意,在测试时,单单一个页面的 PHP 是不会触发错误的,必须通过 include/require 引入才能生效。

      具体还是看大神的文章:问什么不能触发,为什么框架中是可以的?

    三:set_exception_handler()

      看一下官方对于他的解释:设置默认的异常处理程序,用于没有用 try/catch 块来捕获的异常。

    callable set_exception_handler ( callable $exception_handler )
    

    --

    4、自定义处理函数和异常嵌套

    在平常使用中,这个可能使用最多的了,因为之前在使用框架时候,这部分已经进行封装,但是我们希望在对应时候有对应的处理机制,就会一直的扩展下去。

    一:自定义异常处理

      在复杂的系统中,我们往往需要自己捕获我们需要特殊处理的异常,这些异常可能是特殊情况下抛出的。所以我们就自己定义一个异常捕获类,该类必须是 exception 类的一个扩展,该类继承了 PHP 的 exception 类的所有属性,并且我们可以添加自定义的函数,使用的时候其实和之前的一样,大致写法如下:

    <?php
    
    class go extends Exception
    {
        public function M()
        {
            return 'Error line ' . $this->getLine().' in ' . $this->getFile()
                      .': <b>' . $this->getMessage();
        }   
    }
      
    try {
        throw new go($age);
    } catch (go $e) {
        echo $e->M();
    
    }
    

    二:自定义异常处理

    这里借用大佬的一部分代码,总的来说,就是可以嵌套多个 try-cache 在抓到错误时时,分层传递异常。

    注意:在有多个异常时,会优先处理第一个异常

    <?php
    
        class zyfException extends Exception
        {
            public function errorzyfMessage()
            {
                return 'Error line ' . $this->getLine().' in ' . $this->getFile()
                    .': <b>' . $this->getMessage() . '</b> Must in (0 - 60)';
            }
        }
    
        $age = 1000;
    
        try {
            $age = intval($age);
            // if($age > 60) {
                throw new zyfException($age);
            // }
    
            // if ($age <= 0) {
                throw new Exception($age . ' must > 0');
            // }
    
        } catch (zyfException $e) {
            echo $e->errorzyfMessage();
    
        } catch(Exception $e) {
            echo $e->getMessage();
        }
    ?>
    

    --

    关于异常和错误今天就写到着了,感觉真的,大佬写的很好,很受益。

    同时感到了自己的不明白,更应该多学习。

  • 相关阅读:
    WPF
    Xamarin.Forms + Prism,整理页面导航跳转流程
    Xamarin.Forms踩坑整理
    整理
    WPF
    LINQ中,Single()、SingleOrDefault()的解析、示例
    InstallShield打包
    Centos7安装jexus,部署asp.net core,asp.net mvc
    c#修改webConfig的内容
    .net core 3.1简单swagger配置教程
  • 原文地址:https://www.cnblogs.com/25-lH/p/8981688.html
Copyright © 2020-2023  润新知