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 "在异常被捕捉之前+\n";
        Guess_age(121);
        echo '在异常被捕捉之后'; //如果遇到异常被捕捉了,就不会执行这句话
    }catch(Exception $e){
        echo $e->getMessage()."\n";  //打印抛出的信息
        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()."\n";
        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()."\n";
    }catch(My_Exception_2 $e2){
        echo $e2->getinfo().'-------'.$e2->getMessage();
    }

?>

 运行结果

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

posted @ 2018-03-16 13:26  Sch01aR#  阅读(279)  评论(0编辑  收藏  举报