[python] 之 异常对象

一、异常对象

  类异常支持异常的层次结构:超类变成分类名称,而子类变成这个分类中特定种类的异常。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)

posted on 2016-11-07 22:09  萧飞IDO  阅读(1119)  评论(0编辑  收藏  举报

导航