【Python从入门到精通】(十五)Python异常机制,给代码加上安全TAO,不放过一个异常
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦。
本文主要介绍Python的异常机制,重点介绍异常机制的执行过程,以及异常类的继承结构
干货满满,建议收藏,需要用到时常看看。 小伙伴们如有问题及需要,欢迎踊跃留言哦~ ~ ~。
前言
上一篇文章介绍了Python面向对象的三大特性。这篇文章将来讲解Python的异常机制。无论是哪种语言,异常处理都是必不可少的环节。在介绍异常机制之前首先说下错误的分类。在Python中错误分为两类:一类是语法错误,一类是运行时错误。语法错误的话就是代码不符合Python的语法规范由解释器报的错。比如:print "Hello,World!"
语句就不符合语法规范解释器会直接给出错误。运行时的错误就是由于一些空指针或者除数为0导致的错误,语法没问题,但是运行时会报错。
异常类之间的继承关系
异常类的个数和种类有很多。但是这些异常类之间不是相互独立的。它们的继承关系如下图所示:
所有的异常类都继承自基类BaseException类。这个基类BaseException类的父类是object类。基类BaseException类有四个子类。分别是GeneratorExit类,Exception类,SystemExit类,KeyboardInterrupt类。其中Exception类又是实际开发中最常接触到的异常类,程序中可能出现的各种异常,都继承自Exception.它以及它的子类构成了Python异常类结构的基础。其余三个异常类比较少见。
Exception类同样有三个子类,ArithmeticError类用来处理数字异常,BufferError用来处理字符异常。LookupError用来记录关键字异常,
- SyntaxError 语法错误,说白了就是编写的代码不符合语法格式
- IndentationError:缩进错误,Python是根据缩进来决定代码的作用范围的。
- TypeError:类型错误,如果数据类型用错则会报这个错误。
- NameError:变量名错误,忘记定义变量就会报这种错误
- AttributeError:属性错误,特性引用和赋值失效会引发属性错误
- IndexError:索引错误,使用的索引不存在,或索引超出序列范围。
- KeyError:关键字错误,使用了映射中不存在的关键字(键)时引发的关键字错误。
异常机制的使用
介绍完了各种异常类的继承关系,接着就是介绍异常类的使用了。异常类的作用就是捕获程序运行时的各种异常的,如果不手动捕获异常的话,Python程序在遇到异常之后就会抛出异常并停止程序的运行。捕获异常的语法结构如下:
try:
可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
处理异常的代码块2
except [Exception]:
处理其它异常
括号[]
括起来的部分可以使用,也可以省略。其中:
- (Error1, Error2,…) 、(Error3, Error4,…):其中,Error1、Error2、Error3和Error4都是具体的异常类型。显然,一个except块可以同时处理多种异常。
- [as e]:作为可选参数,表示给异常类型起一个别名e,这样做的好处是方便在except块中调用异常类型。
它的执行过程是:
- 首先执行try中的代码块,如果执行过程中出现异常,系统会自动生成一个异常类型,并将该异常提交给Python解释器,此过程称为捕获异常。
- 当Python解释器收到异常对象时,会寻找能处理该对象的except块,如果找到合适的except块,则把该异常交给该except块处理,这个过程称为处理异常。如果Python解释器找不到处理异常的except块,则程序运行终止,Python解释器也将退出。
还是举个简单的例子:
try:
print('try....')
r = 10 / 0
print('result', r)
except ZeroDivisionError as e:
print('ZeroDivisionError', e)
except Exception as e:
print('Exception', e)
print('END')
运行结果是:
try....
ZeroDivisionError division by zero
END
可以看出当ZeroDivisionError异常能够匹配Python解释器自动生成的异常程序就会进入该except块中。这里需要注意的如果将Exception的except块写到ZeroDivisionError的except块前面的话,则运行结果会变成下面的结果。这是因为
ZeroDivisionError是Exception类的子类。
try....
Exception division by zero
END
获取特定异常信息
每种异常类型都提供了如下几个属性和方法,通过调用它们就可以获取当前异常类型的相关信息。
- args: 返回异常的错误编号和描述符号
- str(e):返回异常信息,但不包括异常信息的类型。
- repr(e):返回较全的异常信息,包括异常信息的类型。
try:
print('try....')
r = 10 / 0
print('result', r)
except ZeroDivisionError as e:
print('', e.args)
print('', str(e))
print('', repr(e))
运行结果是:
try....
('division by zero',)
division by zero
ZeroDivisionError('division by zero')
finally
finally代码块,无论try块是否发生异常,最终都要进入finally语句中,并执行其中的代码块,在实际开发中可以将资源回收的工作放入finally块中。这样可以保证当不可预知的异常发生时,资源可以被正常回收。这里的资源指的是数据库连接,文件流的关闭等。
还是以上面的代码为例:
try:
print('try....')
r = 10 / 0
print('result', r)
except Exception as e:
print('Exception', e)
except ZeroDivisionError as e:
print('ZeroDivisionError', e)
finally:
print('发生异常时finally语句块执行...')
print('END')
try:
print('try....')
r = 10 / 1
print('result', r)
except Exception as e:
print('Exception', e)
except ZeroDivisionError as e:
print('ZeroDivisionError', e)
finally:
print('没发生异常时finally语句块执行...')
print('END')
运行结果是:
try....
Exception division by zero
发生异常时finally语句块执行...
END
try....
result 10.0
没发生异常时finally语句块执行...
END
可以看出,无论try中是否发生异常,finally块中的代码都会执行。当然finally块只需要搭配try块使用就可以了。
总结
本文详细介绍了Python的异常机制,其实Python的异常机制使用还挺简单的,就是一个try except的使用。希望对读者朋友们有所帮助。
我是码农飞哥,再次感谢您读完本文。
- 点赞
- 收藏
- 关注作者
评论(0)