面向对象篇之异常和反射

Python——面向对象篇之异常和反射

1.内置函数isinstance和issubclass

1.1 isinstance用法:

isinstance(string,str)

判断第一个参数是否是第二个参数的子集,例如:

print isinstance("test",str)    #判断test是否是字符串类型

C:\Python27\python.exe D:/python/s11/8day/反射/test.py

True


print isinstance(123,int)    #判断123是否是整型类型

C:\Python27\python.exe D:/python/s11/8day/反射/test.py

True

还可以判断对象是否某一个类的实例,返回的是布尔值

1.2 issubclass用法:

1 issubclass(sub, super)

判断sub是否是super的派生类,返回值也是布尔值

注:使用isinstance和issubclass会破坏对象的多态性


异常处理
     python在遇到错误后,会引发异常,如果异常对象并未被处理或者捕捉,则呈现就会用所谓的回溯(traceback)来终止程序的执行,如下所示:

1 C:\Python27\python.exe D:/python/s11/8day/反射/test.py 2 Traceback (most recent call last): 3 File "D:/python/s11/8day/test.py", line 26, in <module> 4 print isinstance(d,int) 5 NameError: name 'd' is not defined

在python里,每个异常都是类Exception的实例,Exception可以说是所有异常的基类。如果我们捉住错误并对其处理,那整个程序就不会回溯而是继续执行下去。

2.1 被动异常
            即把代码写在try块里,当程序抛错时自动触发,except则负责捕捉和处理异常,用法如下

1 try: 2 代码块 3 except Exception,e: #e是exception的实例,是一个对象;上面的错误信息都封装在e中 4 异常处理 #在这里你可以打印异常信息,如(print e);也可以做其他操作如把异常信息写入日志

在这需要注意的是:如果你print e的时候,因为正常来说print对象时返回的应该是对象的内存地址,而在异常处理这里,你print对象时会调用exception的__str__方法,将异常信息返回而不是返回内存地址,所以这里你print的时候会发现显示的会是异常信息,对此你不需要觉得奇怪。


       在except捕获异常时,你还可以在except后面再加个except,就像自来水过滤一样一层层的捕获特定的异常

1 try: 2 代码块 3 except KeyError,e: #试图访问字典里不存在的键 4 print e 5 except ValueError,e: #传入一个调用者不期望的值,即使值的类型是正确的 6 print e 7 except Exception,e: #如果你无法预期会发生什么异常,那好,我们还有个万能异常 8 print e


         另一种写法:

1 try: 2 Garen = Hero 3 except (KeyError,ValueError),e: #写成元组形式 4 print e



2.2 主动触发异常
           不等程序代码遇到错误抛出后才触发,而是我们在预计会出现问题的地方提前触发    

1 try: 2 raise Exception('这里出现错误') #提前传参并实例化异常 3 except Exception,e: #把错误信息封装到exception的实例e里 4 print e


2.3 自定义异常
           既是我们自己定义异常的触发条件和处理方法,创建自定义异常的时候需要直接或者间接的继承Exception

1 class testError(exception): //继承exception异常基类 2 def __init__(self,msg=None): 3 self.msg = msg 4 def __str__(self): 5 if self.msg: //根据传入的参数动态显示异常信息 6 return self.msg 7 else: 8 return "自定义异常" //默认异常显示信息


调用自定义异常

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1207d08e3676b80cfa21f59ee660843a.html