欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python基础学习之异常对象

程序员文章站 2022-09-16 08:08:30
在Python2.6和3.0之前,可以使用类实例和字符串对象来定义异常,但是在字符串对象来定义异常的功能在2.6和3.0的版本中被删除了。 #基于字符串对象来定义异常: m...

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类来自定义自己的异常类。在异常类对象中,可以继承一些内置函数,让异常类继承超类的一些行为。异常类的继承机制,还能在捕捉异常时,让我们捕捉异常更加方便和针对性,超类会变成异常分类的名称,而超类下的子类可以让该异常分类更加细化。