【Python学习】python学习手册--第三十四章 异常对象

在Python2.6和3.0之前,可以使用类实例和字符串对象来定义异常,但是在字符串对象来定义异常的功能在2.6和3.0的版本中被删除了。

#基于字符串对象来定义异常:
mystring="myerror"
try:
   raise mystring
except mystring:
   print("exception happened")

Python现已删除字符串对象的异常,更推荐使用基于类的异常。

基于类的异常

基于类的异常与基于字符串的异常不同,

  • 基于字符串的异常是通过对象识别来匹配的,也就是说except子句是通过Python的is测试来捕捉异常的
  • 类异常则是由超类关系进行匹配,只要except子句列举了该类或者该类的任意超类名,都会被捕捉到。这种基于继承树的类异常捕捉拥有更好的可维护性。让异常可以有清晰的分类,捕捉时会更加灵活。

也就是说类异常可以捕捉列出在except子句后的类,以及该类树中所有较低位置的子类。

  • 在Python3.0中,类异常都是继承自Exception类。
  • 异常的处理中,总是会用引发和捕捉一个类实例对象。

内置Exception类

在Python3.0中的所有熟悉的异常,都是预定义的类,可以作为内置变量名。此外,Python把内置异常组织成层次,来支持各种捕捉模式:

  • BaseException
    异常的顶级根类。这个类不能由用户自定义的类直接继承(使用Exception类继承),它提供了子类的默认打印状态和打印行为。如果在这个类的实例上调用内置函数str,则会返回创建该实例时候所传递的构造函数参数的显示字符串,这个字符串会在出错时打印出来,自定义的异常类,也可以重新编写str函数来显示自己需要打印的异常信息。
>>> raise IndexError
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError
>>> raise IndexError("Hello!")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: Hello!                      #打印出构造实例时所传递的字符串
>>> 
  • Exception
    这个类直接继承自BaseException类,并且是其它内置异常类的超类,几乎所有用户定义的类都应该继承自这个类,事实上,Exception用于except分句时,可以用作try语句的全捕获,并且比一条空的except语句更精确。
  • ArithmeticError
    所有数值错误的超类(也是Exception的一个子类)
  • OverflowError
    识别特定的数值错误的子类

定制打印内容

由上面的内容我们可以知道,默认情况下,由创建实例时传递进入的字符串,可以被异常类记录下来显示,这是因为BaseException中str函数可以记录下传递进入的字符串。在定制自己的str内置函数(由print调用)时,可以用来定制打印内容:

>>> class myerror(Exception):
...     def __str__(self):
...         return "my error exception"
... 
>>> lxm=myerror()
>>> raise lxm
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.myerror: my error exception             #打印出自定义的内容
>>> 

通过异常类的构造函数,还能提供Python代码异常的细节。

>>> class myerror(Exception):
...     def __init__(self,line,filename):
...         self.line=line
...         self.filename=filename
...     def __str__(self):
...         return "my error exception at %d of %s" % (self.line,self.filename)
... 
>>> raise myerror(42,"text")   #调用构造函数,传递相关信息。
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
__main__.myerror: my error exception at 42 of text
>>> 

异常类中还可以写特定的函数和方法(比如将错误信息写入log文件等等),这样的类方法使得异常处理更简单,就只是调用相关类中的方法就能达到效果。

小结

异常在Python中是以类的形式存在,用户可以继承Exception类来自定义自己的异常类。在异常类对象中,可以继承一些内置函数,让异常类继承超类的一些行为。异常类的继承机制,还能在捕捉异常时,让我们捕捉异常更加方便和针对性,超类会变成异常分类的名称,而超类下的子类可以让该异常分类更加细化。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章