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 "", line 1, in IndexError >>> raise IndexError("Hello!") Traceback (most recent call last): File "", line 1, in 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 "", line 1, in __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 "", line 1, in __main__.myerror: my error exception at 42 of text >>>
异常类中还可以写特定的函数和方法(比如将错误信息写入log文件等等),这样的类方法使得异常处理更简单,就只是调用相关类中的方法就能达到效果。
小结
异常在Python中是以类的形式存在,用户可以继承Exception类来自定义自己的异常类。在异常类对象中,可以继承一些内置函数,让异常类继承超类的一些行为。异常类的继承机制,还能在捕捉异常时,让我们捕捉异常更加方便和针对性,超类会变成异常分类的名称,而超类下的子类可以让该异常分类更加细化。
上一篇: es6学习之字符串的改进
下一篇: 好严重的车祸