一、异常对象
类异常支持异常的层次结构:超类变成分类名称,而子类变成这个分类中特定种类的异常。except字句列出一个通用的异常超类,就可捕捉整个分类中的各种异常:任何特定的子类都可匹配。
1 class General(Exception):pass 2 class Specific1(General):pass 3 class Specific2(General):pass 4 5 def raise0(): 6 x=General() 7 raise x 8 9 def raise1(): 10 x=Specific1() 11 raise x 12 13 def raise2(): 14 x=Specific2 15 raise x 16 17 for func in (raise0, raise1, raise2): 18 try: 19 func() 20 except General: 21 import sys 22 print ("caught:", sys.exc_info()[0]) 23 24 for func in (raise0, raise1, raise2): 25 try: 26 func() 27 except General as ins: 28 # import sys 29 print ("caught_as:", ins.__class__) 30 31 # 输出 32 caught: <class ‘__main__.General‘> 33 caught: <class ‘__main__.Specific1‘> 34 caught: <class ‘__main__.Specific2‘> 35 caught_as: <class ‘__main__.General‘> 36 caught_as: <class ‘__main__.Specific1‘> 37 caught_as: <class ‘__main__.Specific2‘>
注意:
①必须继承内置异常超类或内置异常子类,就像object一样:
内置Exception类:
BaseException:异常的顶级根类
Exception:与应用相关的异常顶层根超类
ArithmeticErrot:所有数值错误的超类
OverfloeError:识别特定的数值错误的子类
②引发实例
在类异常模式中,我们总是引发和捕获一个类实例对象。异常实例可以在raise之前创建,就像上述列子,也可在raise语句自身中创建。
可以在except errorname as instance中创建异常实例。
③捕获分类
try语句
④异常细节
主要是通过异常实例进行访问异常细节或异常状态。
二、异常默认打印和状态
内置异常都提供了默认打印显示和状态保持,传给这些异常类的任何构造函数参数都会保存在实例的args元组属性中,并且当打印该实例的时候自动显示(如果没有传递构造函数参数,则使用一个空的元组和显示字符串)传递的参数(以字符串的形式显示)。
1 class E(Exception):pass 2 3 try: 4 raise E(‘spam‘,‘temp‘) 5 except E as x: 6 print (x) 7 8 #输出 9 (‘spam‘, ‘temp‘)
三、异常对象-定制打印显示
默认情况下,捕获并打印基于类的异常的实例的时候,会显示我们传递给异常类构造函数的任何内容;如果定制显示或打印,则默认显示形式(捕获并打印)的信息为定制__str__中的内容,传递的参数可通过元组属性args访问。
当没有捕获异常的时候,如果异常类实例作为一条出错信息的一部分显示,这个继承的默认显示模式也会使用;如果没有定制异常类,则显示传递的构造函数参数,如果定制了异常类,则显示为定制的内容。
1 class Mybad(Exception):pass 2 3 try: 4 raise Mybad(‘Sorry! my mistake!‘) 5 except Mybad as x: 6 print (x) 7 print (x.args) 8 print (‘###‘*8) 9 10 class Bad(Exception): 11 def __str__(self, *args, **kwargs): 12 return "Always look on the bright side of life ..." 13 14 try: 15 raise Bad(‘Bad a bad ‘) 16 except Bad as y: 17 print (y) 18 print (y.args) 19 #输出 20 Sorry! my mistake! 21 (‘Sorry! my mistake!‘,) 22 ######################## 23 Always look on the bright side of life ... 24 (‘Bad a bad ‘,)
1 class Mybad(Exception): 2 def __str__(self): 3 return ‘没有捕获异常‘ 4 5 #输出 6 Traceback (most recent call last): 7 File "F:\python\test.py", line 265, in <module> 8 raise Mybad(‘默认‘) 9 __main__.Mybad: 没有捕获异常
1 class Mybad(Exception):pass 2 3 raise Mybad(‘默认‘) 4 5 #输出 6 7 Traceback (most recent call last): 8 File "F:\python\test.py", line 265, in <module> 9 raise Mybad(‘默认‘) 10 __main__.Mybad: 默认
四、定制数据和行为
类似与类的继承、定制、扩展;
使用了异常类实例(如:except Exception as instance)