- python中为避免代码发生错误影响程序执行,引入了异常。
当python脚本发生异常时,需要捕获并处理异常,否则程序会终止执行。每一个异常都是一些类的实例,这些实例可以被引用,可以通过多种方法进行捕捉,使得错误可以被处理,而不是终止整个程序。另外,异常具有“传播性”,如果未被处理,就会“传播”到函数中,进而到类等高一层次,最终到达程序最顶层,使程序终止。
- 异常处理(跳过发生错误的语句、语句块,并反馈错误类型,程序并不会终止)
语法如下:
try:
<语句> #运行的代码
except<异常名称>:
<语句> #如果try部分发生异常
try的工作原理为:开始一个try语句后,python就在当前程序的上下文中作标记,当出现异常时就会回到做标记的地方。(首先执行try的语句,至于except的语句是否执行则取决于try中语句是否发生异常,另外,只要try中的语句块有一个语句发生异常,后续语句便不会执行。)
- 抛出异常
raise语句可以抛出指定异常,即通过raise语句可以在代码正确的情况下,输出错误信息。通过类(Exception的子类)或实例参数和raise语句配合使用引发异常(raise语句就是一个输出异常的语句)。在使用类时,程序会自动创建实例。
不想处理异常时,可以在语句块末尾加上一个raise语句,以便查看是否抛出异常,如:
python中常见的内建异常类:
异常名称 | 相关描述 |
Exception | 常规错误的基类 |
AttributeError | 对象没有这个属性 |
IOError | 输入/输出操作失败 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
NameError | 未声明/初始化对象(没有属性) |
SyntaxError | python语法错误 |
SystemError | 一般解释器系统错误 |
ValueError | 传入无效的参数 |
- 捕捉多个异常(捕获异常语句的“嵌套”使用)
语法如下:
try:
<语句> #运行的代码
except <异常名称1>:
<语句> #如果在try部分引发了异常1,则执行该语句
.......
except <异常名称n>:
<语句> #如果try部分引发了异常名称n,则执行该语句
只要异常类型和except后面的名称类型相符,就会执行except 后面的语句,一个try语句可以同时有多个except语句,但最多只会执行其中的一个语句。
处理程序时,只会将try语句的子句进行异常处理,对于其他句子则没有作用。若try子句发生的异常在后续的所有except语句后的异常名中都没找到,那么程序会终止,并报错。
抛出异常的优点在于,其可以更简单、直观、清晰的帮助用户定位问题,并且可以自定义异常信息(出现异常后的提示语句),进一步定位问题所在。
- 使用一个块捕捉多个异常(使用一个try和一个except语句捕捉多个异常,此处也可以直接将except后的异常名写为:Exception,基类异常)
需要使用一个except语句捕捉多个异常时,只需在except 后用元组将异常名列出即可。
- 捕捉对象
在except语句后加上:as 自定义变量名,就能够输出真正的异常信息,而不是用户自定义的提示信息。
由输出结果可以看到,输出了真正的异常信息,而且,b=name发生错误后,后面的语句没有执行。
- 全捕捉
对于有些不包含在异常类中的异常,使用try/except语句时就有可能漏掉,进而发生致命错误,但可以在except子句中忽略所有异常类(即except语句后不在标注异常类名),进而使程序输出自己定义的异常信息。
- 异常中的else
在except整个语句块之后,可以添加一个else语句,else的子句在try的子句没有异常发生的情况下才会执行,而else的子句可以帮助我们判断程序的执行情况。
- 自定义异常
使用自定义异常主要用于精确定位问题,进而知道问题的根源。
自定义异常即定义继承基类(Exception)的异常类。
- finally子句
finally需要和try语句组合使用,无论try语句是否执行,都会执行finally语句。另外,try、except、else和finally可以组合使用,但需要注意的是,else在except之后,finally在else和except之后。
其组合使用时,执行流程:先对try的子句执行,发现异常时,执行except语句,然后执行finally子句,如果后面有else语句,则先执行else再执行finally子句。finally子句肯定是最后执行的,另外,如果try没有发生异常,那么先执行else然后在执行finally子句。
- 异常和函数
异常在函数中引发后,如果没被处理,就会层层传播,除非在某个层次被处理,否则就会使程序终止,输出错误信息。
另外,异常信息是以堆栈的形式被抛出的,即最先发现的异常信息最后被输出(先进后出)