• 扩展PHP内置的异常处理类


    在try代码块中,需要使用throw语句抛出一个异常对象,才能跳到转到catch代码块中执行,并在catch代码块中捕获并使用这个异常类的对象。虽然在PHP中提供的内置异常处理类Exception,已经具有非常不错的特性,但在某些情况下,可能还要扩展这个类来得到更多的功能。所以用户可以用自定义的异常处理类来扩展PHP内置的异常处理类。以下代码说明了在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <?php
    class Exception{
    protected $message = 'Unknown exception'; //异常信息
    protected $code = 0; //用户自定义异常代码
    protected $file; //发生异常的文件名
    protected $line; //发生异常的代码行号
     
    function __construct($message =null,$code=0){}
    final function getMessage(){} //返回异常信息
    final function getCode(){} //返回异常代码
    final function getFile(){} //返回发生异常的文件名
    final function getLine(){} //返回发生异常的代码行号
    final function getTrace(){} //backtrace()数组
    final function getTraceAsString(){} //已格式化成字符串的getTrace()信息
     
    //可重载的方法,可输出字符串
    function __toString(){}
    }
    ?>

    上面这段代码只为说明内置异常处理函数类Exception的结构,它并不是一段有实际意义的可用代码。如果使用自定义的类作为异常处理类,则必须是扩展内置异常处理类Exception的子类,非Exception类的子类是不能作为异常处理类使用的。如果在扩展内置异常处理类Excepiton时重新定义构造函数,建议同时调用parent::construct()来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。可以在自定义的子类中,直接使用内置异常处理Exception类中的所有成员属性,但不能重新改写从该父类中继承过来的成员方法,因为该类的大多数公有方法都是final的。
    创建自定义的异常处理程序非常简单,和传统类的声明方式相同,但该类必须是内置异常处理类Exception的一个扩展。当PHP中发生异常时,可调用自定义异常类中的方法进行处理。创建一个自定义的MyException类,继承了内置异常处理类Exception中的所有属性,并向其添加了自定义的方法。代码及应用如下所示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
    //滴定仪一个异常处理类,但必须是扩展内异常处理类的子类
    class MyException extends Exception{
    //重定义构造器使第一个参数message变为必须被指定属性
    public function __construct($message,$code=0){
    //在这里定义一些自己的代码
    //建议同时调用parent::construct()来检查所有的变量是否已被赋值
    parent::__construct($message,$code);
    }
    //重写父类方法,自定义字符串输出的样式
    public function __toString(){
    return __CLASS__.":[".$this->code."]:".$this->message."<br>";
    }
    //为这个异常自定义一个处理方法
    public function customFunction(){
    echo "按自定义的方法处理出现的这个类型的异常<br>";
    }
    }
     
    try{
    $error='允许抛出这个错误';
    throw new MyException($error); //创建一个自定义异常的处理对象,通过throw语句抛出
    echo 'Never executed'; //从这里开始,try代码块内的代码将不会再被执行
    }catch(MyException $e){ //捕获自定义的异常对象
    echo '捕获异常:'.$e; //输出捕获的异常消息
    $e->customFunction(); //通过自定义的异常对象中的方法处理异常
    }
     
    echo '你好呀'; //程序没有崩溃继续向下执行
    ?>

    在自定义的MyExcepition类中,使用父类中的构造方法检查所有的变量是否已被赋值。而且重载了父类中的__toString()方法,输出自己定制捕获的异常处理类,在使用上没有多大区别,只不过在自定义的异常处理类中,可以调用为具体的异常专门编写的处理方法。

     
  • 相关阅读:
    【分布式事务】的一篇良心之作!
    如何保证缓存与数据库的数据一致性
    30多岁的大龄程序员,应该如何保持职场竞争力
    Kafka acks参数对消息持久化的影响
    Kafka 如何优化内存缓冲机制造成的频繁 GC 问题?
    Shell中的特殊符号(special characters)和含义
    Bash中的一些常用的数组相关的特殊语法(array syntax)
    一站式搞定Bash脚本的参数处理问题
    Bash脚本set命令教程
    Bash中的eval命令
  • 原文地址:https://www.cnblogs.com/ncong/p/3941409.html
Copyright © 2020-2023  润新知