• php核心技术与最佳实践 --- 错误与异常


    <?php
    /*php error*/
    /*
     * 异常和错误的概念不一样
     * 在PHP里,遇到任何自身错误都会触发一个错误,而不是抛出异常(对于一些情况,会同时抛出异常和错误)
     * 异常处理机制就是把"描述在正常过程中做什么事的代码"和"出了问题怎么办的代码"进行分离
     */
    $a = null;
    try{
       /* $a = 5/0;*/
        echo $a;
    }catch(exception $e){
        $e->getMessage();
        $a = -1;
    }
    echo $a;
    // Warning: Division by zero in C:phpStudyPHPTutorialWWWphpmaindemo.php on line 10
    /*
     * 由以上运行结果可以看到,对于除零这种"异常"情况,PHP认为这是一种错误,直接触发错误,而不会自动抛出异常
     * 使程序进入异常流程,故最终a值并不是预想中的 -1
     * 也就是说,并没有进入异常分支,也没有处理异常。
     * php只有你主动throw后,才能捕获异常(一般情况使这样,也有一些异常可以自动捕获)
     * 而对于java,则认为零属于ArithmeticException ,会对其进行捕获,并对异常进行处理。
     * 也就是说,php通常使无法自动捕获有意义的异常的,它把所有不正常的情况都视作了错误,
     * 你想捕获这个异常,就得使用if...else结构,保证代码使正常的,然后判断如果除数为0,则手动抛出异常,再捕获。
     * 注意 : 其实php和java之间之所以由这个差距,根本原因在于,在java里,异常是唯一错误报告方式,
     * 而在php中却不是这样。通俗一点讲,这就是两种语言对异常和错误的界定存在分歧。什么是异常,什么是错误,
     * 两种语言的设计者存在不同观点。
     * 也就是说,php只有手动抛出异常后才能捕获异常,或者是有内建的异常机制时,会先触发错误,再捕获异常。
     */
    class emailException extends exception{
    
    }
    class pwdException extends Exception{
        function __toString(){
            return "<div class='error'>Exception {$this->getCode()}:{$this->getMessage()}
                    :in File:{$this->getFile()}on line:{$this->getLine()}</div>";
            // 改写异常结果
        }
    }
    function reg($reginfo = null){
        if(empty($reginfo) || !isset($reginfo)){
            throw new Exception("参数非法");
        }
        if(empty($reginfo['email'])){
            throw new emailException("邮件为空");
        }
        if($reginfo['pwd'] != $reginfo['repwd']){
            throw new pwdException("两次密码不一致");
        }
    }
    // 异常分发完了,现在对异常进行分拣并做处理
    try{
        reg(['email' => '11' , 'pwd' => 12345678 , 'repwd' => 12345678]);
        // 这种情况不会捕获到异常
        //reg([])  触发异常且会被第三个catch块捕获。输出异常信息:参数非法
        reg(['email' => '' , 'pwd' => 12345678 , 'repwd' => 12345678]);
        // 触发异常且会被第一个catch块捕获。输出异常信息:
        // exception 'emailException' with message '邮件为空' in C:phpStudyPHPTutorialWWWphpmaindemo.php:46 Stack trace: #0 C:phpStudyPHPTutorialWWWphpmaindemo.php(57): reg(Array) #1 {main}
        /*reg(['email' => '123' , 'pwd' => 12345678 , 'repwd' => 123456789]);*/
        // 触发异常且会被第二个catch块捕获。输出异常信息:
        // Exception 0:两次密码不一致 :in File:C:phpStudyPHPTutorialWWWphpmaindemo.phpon line:49
    
    }catch(emailException $e){
        echo $e;
    }catch(pwdException $ep){
        echo $ep;
    }catch(Exception $e){
        echo $e->getMessage();
    }
    // 注意 : 当函数出现异常后,就不会继续往下执行了。只会执行相应catch块的内容。
    // 多次处理写catch的时候,如果有父子类关系,子类在前面,父类在后面
    // 因为异常对象会从上到下对catch进行检测,检测参数列表中的对象与我们抛出的对象类型是否一样,且是否是父(catch块的对象)-子(抛出的对象)类关系;
    // 如果把第三个catch块放到第一个的位置,那么后面两个catch块也永远不可能被执行
    // 在这里,对表单进行异常处理,通过重写异常类、手动抛出错误的方式进行异常处理。这是一种业务异常,可以认为地把所有不符合要求的情况都视作业务异常,
    // 和通常意义上的代码异常相区别
    // 如果代码中只是象征性地try...catch,然后打印一个报错,最后over。这样的异常不如不用,因为其没有体现异常思想。所以合理的代码如下
    /*try{
        可能出错的代码段
        if( 文件上传不成功 ) throw ( 上传异常 );
        if( 插入数据不成功 ) throw ( 数据库操作异常 );
    }catch( 异常 ){
        必要的补救措施,如删除文件、删除数据库插入记录,这个处理很细致
    }*/
    
    /*错误*/
    // php错误处理比异常的价值大得多。php错误的概念已经和异常做过比较,这里通过对oho异常的认知,给php错误下个最直观最通俗的结论:php错误就是会使
    // 脚本运行不正常的情况
    // php里有一套错误处理机制,可以使用set_error_handler接管php错误处理,也可以使用trigger_error函数主动抛出一个错误
    
    // 自定义错误处理函数
    function customError($errno,$errstr,$errfile,$errline){
        echo "自定义".$errno.';'.$errstr.';'.$errfile.';'.$errline;
    }
    set_error_handler("customError");
    1/0;  //自定义2;Division by zero;C:phpStudyPHPTutorialWWWphpmaindemo.php;96
    // set_error_handler()函数会接管php内置的错误信息,你可以在同一个页面使用restore_error_handler() 取消接管
    // 注意:如果使用自定义的 set_error_handler 接管php的错误信息,先前代码里的错误抑制@将失效,这种错误也会被显示
    // php把很多异常看做错误,这样就可以把这些"异常"像错误一样用 set_error_handler 接管,进而主动抛出异常
    // 提示,如果使用该函数,会完全绕过标准PHP错误处理函数,如果有必要,用户定义的错误处理程序必须终止 (die())脚本
    trigger_error('测试'); // 定义1024;测试;C:phpStudyPHPTutorialWWWphpmaindemo.php;99
    
    // 在php中,错误和异常是两个不同的概念,这种设计从根本上导致了PHP的异常和其他语言相异。
    // 以java为例,在java中,异常是错误的唯一报告方式。说到底,两者的区别就是对异常和错误的认识不同而产生的。php的异常大部分必须通过某种办法手动抛出,才能被
    // 捕获到,是一种半自动化的异常处理机制
    // 无论错误还是异常,都可以使用handler接管系统已有的处理机制
  • 相关阅读:
    c++ namespace简单用法
    python2编码问题
    python dict()函数 /// logging模块///yield//生成器和迭代器
    python 对于一个字典,根据其value值获取其对应的keys值
    python 包/库/模块
    python __init()__
    python continue 和 break的区别
    python list去重
    linux命令,将一个文件夹中的内容copy到另外一个文件夹
    python 正则(re.compile()/re.findall())
  • 原文地址:https://www.cnblogs.com/cl94/p/11361573.html
Copyright © 2020-2023  润新知