zoukankan      html  css  js  c++  java
  • PHP-异常处理

    异常是程序在执行过程中出现一个例外或一个事件,程序中断了正常的运行,跳转到程序的其它模块继续运行

    PHP内置的异常处理类Exception

    <?php
    /**
     * Author: MuT6 Sch01aR
     * Date: 2018/3/17
     * Time: 12:28
     */
    
        class Exception{
            protected $message = 'Unknown exception';  //异常信息
            protected $code = 0;                       //用户自定义异常代码
            protected $file;                           //发生异常的文件名
            protected $line;                           //发生异常的代码行号
    
            function __construct($message = null, $coed = 0){}  //构造方法
    
            final function getMessage(){}             //返回异常信息
            final function getCode(){}                //返回异常代码
            final function getFile(){}                //返回发生异常的文件名
            final function getLine(){}                //返回发生异常的代码行号
            final function getTrace(){}               //获取异常追踪信息
            final function getTraceAsString(){}       //获取字符串类型的异常追踪信息
    
            //可重载的方法
            function __toString(){}                    //将异常对象转换为字符串
    
            function __clone(){}                       //异常克隆
        }
    
    ?>
    

    实现异常处理

    <?php
    /**
     * Author: MuT6 Sch01aR
     * Date: 2018/3/14
     * Time: 22:37
     */
    
        function Guess_age($age){
            if ($age > 120){
                throw new Exception('年龄过大');  //需要将异常抛出
            }
            else{
                echo '年龄无误';
            }
        }
    
        try{
            echo "在异常被捕捉之前+
    ";
            Guess_age(121);
            echo '在异常被捕捉之后'; //如果遇到异常被捕捉了,就不会执行这句话
        }catch(Exception $e){
            echo $e->getMessage()."
    ";  //打印抛出的信息
            echo $e->getLine();  //打印哪一行异常
        }
    
    ?>
    

     运行结果

    异常被捕捉到前的语句被执行了,异常被捕捉之后的语句没有执行

    扩展异常处理类

    我们可以扩展异常处理类来添加一些自定义的方法

    <?php
    /**
     * Author: MuT6 Sch01aR
     * Date: 2018/3/14
     * Time: 23:38
     */
    
        //继承父类Exception
        class My_Exception extends Exception{
            function getinfo()  //不能改写父类中的成员方法
            {
                echo '这是My_Exception';
            }
        }
    
        function Guess_age($age)
        {
            if ($age > 120) {
                throw new My_Exception('年龄过大');
            } else {
                echo '年龄无误';
            }
        }
    
        try{
            Guess_age(121);
        }catch(My_Exception $e){
            echo $e->getinfo()."
    ";
            echo $e->getMessage();
        }
    
    ?>
    

     运行结果

    顶级异常处理器

    catch捕捉到的异常,也可以继续抛出去交给系统的顶级异常处理器来处理

    也可以自己定义一个顶级异常处理函数

    <?php
    /**
     * Author: MuT6 Sch01aR
     * Date: 2018/3/14
     * Time: 23:32
     */
    
        function My_Exception($e){
            echo '当前为顶级异常处理函数:'.$e->getMessage();
        }
    
        set_exception_handler('My_Exception');
    
        function Guess_age($age){
            if ($age > 120){
                throw new Exception('年龄过大');
            }
            else{
                echo '年龄无误';
            }
        }
    
        try{
            Guess_age(121);
        }catch(Exception $e){
            throw $e;  //把异常抛给顶级异常处理函数来处理
        }
    
    ?>
    

     运行结果

    处理多个异常

    通过catch捕获多个异常,当try中抛出异常后,catch会捕捉相应的异常进行处理

    <?php
    /**
     * Author: MuT6 Sch01aR
     * Date: 2018/3/14
     * Time: 23:52
     */
    
        class My_Exception_1 extends Exception{
            function getinfo()  //不能改写父类中的成员方法
            {
                echo '这是My_Exception_1';
            }
        }
    
        class My_Exception_2 extends Exception{
            function getinfo()  //不能改写父类中的成员方法
            {
                echo '这是My_Exception_2';
            }
        }
    
        function Guess_Age($age){
            if ($age > 120){
                throw new My_Exception_1('年龄过大');
            }
            else{
                echo '年龄无误';
            }
        }
    
        function Guess_Name($name){
            if ($name != 'John'){
                throw new My_Exception_2('名字错误');
            }else{
                echo '名字正确';
            }
        }
    
        try{
            Guess_Age(123);
            Guess_Name('Jack');
        }catch(My_Exception_1 $e1){
            echo $e1->getinfo().'-------'.$e1->getMessage()."
    ";
        }catch(My_Exception_2 $e2){
            echo $e2->getinfo().'-------'.$e2->getMessage();
        }
    
    ?>
    

     运行结果

    只捕捉到了第一个异常,因为try中有异常被捕捉后,后面的语句就不执行了

  • 相关阅读:
    蛙蛙推荐:用.net 4.0构建新浪微博开发平台应用
    蛙蛙推荐:Backbone官方文档翻译
    蛙蛙推荐:javascript异步任务流
    蛙蛙推荐:sqlserver三种分页方式性能比较
    蛙蛙推荐:css背景图片固定居中,div阴影,背景半透明,div圆角,DIV渐变
    如何高效的利用新浪微博获取信息
    蛙蛙推荐:gevent并发发送UDP包演示
    蛙蛙推荐:神马ORM都是浮云,看看史上最简单最好用的OleDbHelper
    蛙蛙推荐:写了一个简单的延迟队列
    PostgreSQL中with和without time zone两者有什么区别 规格严格
  • 原文地址:https://www.cnblogs.com/sch01ar/p/8580551.html
Copyright © 2011-2022 走看看