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 "自定义异常" //默认异常显示信息
调用自定义异常