为了账号安全,请及时绑定邮箱和手机立即绑定

老师,这里不是创建的是异常处理的基类Exception吗 ,实例为对象之后,为什么可以访问到继承于它的MyExceptionz子类里面的getInfo()方法啊?

老师,这里不是创建的是异常处理的基类Exception吗 ,实例为对象之后,为什么可以访问到继承于它的MyExceptionz子类里面的getInfo()方法啊?
//自定义的异常类,继承了PHP的异常基类Exception
class MyException extends Exception {
    function getInfo() {
        return '自定义错误信息';
    }
}

try {
    //使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
    throw new MyException('error');//这里规定如何触发异常。注意:每一个 "throw" 必须对应至少一个 "catch",当然可以对应多个"catch"
} catch(Exception $e) {//"catch" 代码块会捕获异常,并创建一个包含异常信息的对象
    echo $e->getInfo();//获取自定义的异常信息
    echo $e->getMessage();//获取继承自基类的getMessage信息
}


正在回答

5 回答

这里我曾经也有疑问,我是这么理解的,catch(Exception $e)语句表示你拿什么类去捕获抛出的异常,按照php的语法介绍,catch(Exception $e)可以去捕获继承它的子类所抛出的异常对象,但是反过来catch(MyException $e)无法捕获基类抛出的异常。至于方法,只需要看它是哪个类抛出的,因为你代码中的getInfo方法是MyException类的对象抛出的,所以当然可以调用。也就是说catch(Exception $e)代表你捕获到了MyException抛出的异常对象,$e就是这个对象,所以后面的调用都合理了,至于为什么父类可以捕获基类的异常,而子类无法捕获基类的,我也发不清楚。

0 回复 有任何疑惑可以回复我~

给后来人,感觉上面的同学都没理解楼主的困惑在哪儿....$e->getInfo()并不是调用的父类方法,这里的$e实际就是MyException,因为 catch(Exception $e) 这儿是可以接受Exception类和它的子类的;

1 回复 有任何疑惑可以回复我~
#1

慕沐7363818

终于有一个好的回答
2018-08-14 回复 有任何疑惑可以回复我~

父类里面申明的public方法是可以被其子类或者孙子类访问调用的!

0 回复 有任何疑惑可以回复我~

catch(Exception $e) 中的Exception 是类型声明,意思是$e只能是Exception

或者是它的继承子类等的实例。而$e是throw时创建的实例,是Exception的子类,所以可以调用本身的方法。
2 回复 有任何疑惑可以回复我~

因为MyException继承了Exception类呀,getinfo()的访问控制是public不是private,所以能访问呀

0 回复 有任何疑惑可以回复我~
#1

Zhenyu1990

但是MyException是Exception的子类,父类Exception可以直接调用子类MyException的方法吗?
2015-12-11 回复 有任何疑惑可以回复我~
#2

张的高

看我写的这篇http://www.zhibudao.net/?p=357
2015-12-13 回复 有任何疑惑可以回复我~
#3

jameslam 回复 张的高

"如果A是B的子或者孙子类,也会成功 但是 如果A 是B的父类,则不会捕获成功,而且还会出现致命的语法错误。"看了你后面的总结,感觉文章写得很好,但意犹未尽,感觉还没有深入解释为什么会出现这种情况,希望能更详细得解释下,谢谢~
2015-12-23 回复 有任何疑惑可以回复我~
#4

jameslam 回复 张的高

问了一位朋友,他说里面有个叫控制反转(IOC)的设计模式,这个对我目前的水平来说就太深奥了,大家可以去了解下
2015-12-23 回复 有任何疑惑可以回复我~
#5

张的高 回复 jameslam

其实我只发现了哪种情况下可能出现的哪种情况,并没有发现为什么,还是学的不深,大家一起努力吧。
2015-12-23 回复 有任何疑惑可以回复我~
查看2条回复

举报

0/150
提交
取消

老师,这里不是创建的是异常处理的基类Exception吗 ,实例为对象之后,为什么可以访问到继承于它的MyExceptionz子类里面的getInfo()方法啊?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信