zoukankan      html  css  js  c++  java
  • 跟着百度学PHP[11]-PHP当中的异常处理

    首先要说一下常见的三种错误:

    1.语法错误

    2.运行错误

    3.逻辑错误

    00x1 错误报告及错误级别


    PHP的错误分为三个等级

    1.注意(notice)   没有变量a

    2.警告(warning) 没有给函数传值

    3.致命的错误(fatal error) 函数写错

    错误的报告级别可以在PHP.ini当中修改。
    在PHP.ini当中找到错误报告“error_reporting = E_ALL ” 这个的意思是将所有的错误都提示出来。
    ps:~是除了的意思。&是和的意思。
    error_reporting = E_warning & E_fatal error (仅提示警告warning和致命错误fatal error)
    error_reporting = E_ALL ~ E_notice (提示全部,除了注意notice)

    00x2 自定义PHP报告错误处理方式


    什么叫做自定义报告错误的处理方式呢?

    也就是

    ( ! ) Fatal error: Call to undefined function geaaattype() in D:wampwwwdnf.php on line 2

    按照我们意图来写。

    很显然这个错误是PHP自己系统已经自带的。那么我们需要告诉PHP我们不要你自身的这个错误函数,我要自己创建一个。

    set_error_handler("myerrorfun");(handler音译:处理)这个语句就是告诉PHP我要自己创建一个myerrorfun的错误信息。然后你需要定义一下这个函数。代码大概如下所示:

    <?php 
    set_error_handler("myerrorfun");#注册一个myerrorfun的错误函数
    function myerrorfun($type,$mess,$file,$line){#这个函数有四个参数,分别是错误类型,错误信息,错误文件,错误行
    }
     ?>

    00x3 设置错误日志


    在php.ini当中有显示错误:display_errors = On  默认是开着的,我们可以off关闭它。apache的日志文件:log_errors = On

    如果想要把apache的日志文件写入windows的系统日志里面,就可以将:error_log = syslog开启。默认是被注释掉的。分号是注释。


    00x4 PHP异常处理(try catch

    如果有trow new exception的话那么就是有异常。

     1 <?php 
     2 echo "早上起床<br />";
     3 try{
     4 echo "开车上班。<br />";
     5 throw new Exception("车子爆胎。<br />");//抛出异常,有异常第六行的echo不进行执行直接执行catch
     6 echo "路况很好。";
     7 }catch(Exception $e){
     8 echo $e->getmessage();//其实这里的$e就是异常。Exception是系统已经定义好了的了一个类,调用其getmessage方法即可。
     9 echo "换上备胎,继续开车去上班。<br />";
    10 }
    11 ?>

     本来是按照顺序,1-2-3-4-5-6....这样执行的,但是当程序执行到throw new Exception(抛出新的异常)的时候就会直接跳过第六行去执行第8行的,而会被赋值给$e,Exception其实是一个类,系统定义好的一个类,可以通过调用Getmessage来获取第5行里面的“车子爆胎”这个数据。倘若没有throw new Exception的话,就会直接向下执行,说路况很好,进而不执行第9行的代码。

    那么问题来了,怎么知道系统发生错误了呢???

    思路:可以注册一个错误函数(00x2有讲到),然后使用if判断错误的类型。

    案例:

    <?php 
    set_error_handler("myerrorfun");
    function myerrorfun($type,$mess,$file,$line){
        if ($type == E_WARNING) {#如果错误类型出现了严重,那么抛出异常(也就是throw new Exception)
            throw new Exception("出现了严重的错误。{$mess},{$file},{$line}");
        }
    }
    function say($language){#定义一个say函数
        echo $language;#直接输出这个函数。
    }
    say();#故意错误的使用函数。
     ?>

    结果爆出如下错误:

    ( ! ) Fatal error: Uncaught exception 'Exception' with message '出现了严重的错误。Missing argument 1 for say(), called in D:wampwww est.php on line 11 and defined,D:wampwww est.php,8' in D:wampwww est.php on line 5
    ( ! ) Exception: 出现了严重的错误。Missing argument 1 for say(), called in D:wampwww est.php on line 11 and defined,D:wampwww est.php,8 in D:wampwww est.php on line 5

    那么正确书写say函数的话就不会报错了。

    <?php 
    set_error_handler("myerrorfun");
    function myerrorfun($type,$mess,$file,$line){
        if ($type == E_WARNING) {#如果错误类型出现了严重,那么抛出异常(也就是throw new Exception)
            throw new Exception("出现了严重的错误。{$mess},{$file},{$line}");
        }
    }
    function say($language){#定义一个say函数
        echo $language;#直接输出这个函数。
    }
    say("珍惜爱你的人,不要等失去才珍惜。我会一直爱着你。");#故意错误的使用函数。
     ?>


    00x4 自定义异常类

    前面学习到的Exception是系统早就有了的异常类,那么我们可不可以自定义异常类呢?答案无疑是肯定的。

    <?php 
    class MyException extends Exception{#必须要继承Exception否则无效。
        function say(){#定义一个解决方法的函数。
            echo "say函数的语法是:say('strting')";
        }
    }
    echo "11111111111<br />";
    try{
        echo "2222222222222<br />";
        throw new MyException("语法错误。");#抛出语法错误调用catch
        echo "3333333333333<br />";
    }catch(Myexception $e){
        echo $e->getmessage()."<br />";#调用Myerrot类中的getmessage方法。
        echo $e->say()."<br />";#调用MyException类中的解决方法。
    }
     ?>

    00x5 多个异常处理

    <?php 
    $kaichu = "no";
    class gowc_Exception extends Exception{#创建一个gowc_Exception的类并且继承父类Exception
        function solve(){#建立一个解决方法的方法(此知识点属于OOP,函数即方法,属性即变量)
            echo "该问题的解决方法:厕所坏了可以去公共车厕所。<br />";
        }
    }
    class chizaodian_Exception extends Exception{
        function solve(){
            echo "该问题的解决方法:你可以选择不吃早点。<br />";
        }
    }
    class qushangban_Exception extends Exception{
        function solve(){
            echo "该问题的解决方法:轮胎爆了赶紧换上备胎。<br />";
        }
    }
    class shangban_Exception extends Exception{
        function slove(){
            echo "重新找工作。";
        }
    }
    
    
    
    
    echo "早上起床<br />";
    //-------------------------------------第一个错误-----------------
    try{
        echo "起床去上厕所<br />";
        throw new gowc_Exception("马桶坏了。");#抛出一个gowc_Exception的异常类。
        echo "上完厕所,做下一件事情。<br />";#如果没有异常执行该行。
    } catch(gowc_Exception $e){
        echo $e->getmessage();#如果有异常执行该行
        echo $e->solve();
    }
    //-------------------------------------第二个错误-----------------
    try{
        echo "去吃早餐<br />";
        throw new chizaodian_Exception("早点已经卖完了。");
        echo "吃完早点准备开车去上班。";
    }catch(chizaodian_Exception $e){
        echo $e->getmessage();
        echo $e->solve();
    }
    //-------------------------------------第三个没有错误-----------------
    try{
        echo "开车去上班。<br />";
        echo "路况很好顺利到公司。<br>";
    }catch(qushangban_Exception $e){
        echo $e->getmessage();
        echo $e->solve();
    }
    //-------------------------------------使用if判断---------------------
    try{
        echo "开始工作。<br />";
        if($kaichu == "yes"){#判断是否被开除。如果是就抛出异常。否者就输出工作完成,
            throw new shangban_Exception("你被开除了");
        }
        echo "工作完成。";
    }catch(shangban_Exception $e){
        echo $e->getmessage();
        echo $e->slove();
    }
     ?>

    输出效果如下所示:


    THE END

  • 相关阅读:
    数字签名与HTTPS详解
    利用策略模式优化过多 if else 代码
    Redis 的事务到底是不是原子性的
    Spring Boot项目的接口防刷
    深入分析 ThreadLocal
    什么是四层和七层负载均衡?他们之间的区别是什么?
    MyEclipse或Eclipse中project的导入和导出
    org.hibernate.exception.ConstraintViolationException: could not insert:
    C++ STL vector(向量容器)的使用(附完整程序代码)
    Swift2.0语言教程之函数嵌套调用形式
  • 原文地址:https://www.cnblogs.com/xishaonian/p/6379792.html
Copyright © 2011-2022 走看看