Python 学习笔记(12)错误&异常
12.1 错误&异常定义
在编程过程中经常会碰到各种各样的错误,可以大致将这些错误分为两类,即【语法错误】和【运行时错误】。
12.1.1 语法错误
语法错误是指当代码被解释时发现不符合python语法规则而报出 SyntaxError
。
语法错误属于真正意义上的错误,大多数是由编程者的疏忽或对于编程规则的不熟悉导致的,程序需要在修改所有的语法错误后才能正常运行。
12.1.2 运行时错误
代码在语法规则上正确但依旧又可能会在运行时发生错误,例如被除数设为0等,这种就是运行时错误,我们将之称为【异常】。
异常类型 | 含义 |
---|---|
AssertionError | assert 关键字后的条件为假 |
AttributeError | 调用或访问的对象属性不存在 |
IndexError | 索引超出序列范围 |
KeyError | 字典中查找不存在的关键字 |
NameError | 调用或访问一个未定义变量 |
TypeError | 不同类型数据之间违规操作 |
ZeroDivisionError | 除数为0 |
当程序发生异常时,可以通过捕获异常的名称后通过其他代码让程序继续运行,这种逻辑处理机制被称为【异常处理】。
通过异常处理可以使开发者全面管理自己的程序,在可能出错的地方添加相应的处理从而提高程序的健壮性。
实际上,异常处理机制通常用来预防各种可能出现的问题或错误,同时也可以给用户的任何非法输入提供对应的输出,毕竟开发者无法考虑到所有的情况并进行相应的补救,这是一个十分耗费时间和精力的事情。
12.2 异常处理
try:
...
except [error [as xxx]]:
...
except [(error_1, error_2) [as xxx]]:
...
except:
...
[else:
...
finally:
...]
"""
except 块可以一次定义需要处理的多种异常,使用元组形式存储;可以使用 except error_1: pass 捕获后忽略错误;
当 except 不接任何异常时代表可捕获所有类型的异常,一般放在最后一个位置;
else 块中包含的语句会在没有任何异常的情况下执行,即使在前面的 except 中处理了异常也不会执行;
finally 块中的内容无论是否发生了异常最后都会执行,可以直接写成 try...finally...,通常可用于释放资源例如关闭文件等。当 try/except 中包含了 return 语句时,会先跳转到 finally 执行后返回执行 return。
"""
捕获异常:try
中包含的是需要监测的代码块,如果出现异常系统则会自动生成一个异常类型,并将该异常提交给解释器;代码块中【异常发生点】后的剩余代码永远不会运行;
处理异常:当解释器收到异常后,会依次比较符合该异常的 except
块,找到归属后执行块中包含的语句。
12.3 手动设置异常
raise
raise [exceptionName]
raise [exceptionName [(reason)]]
"""
单独 raise 语句将会引发当前上下文中捕获的异常或默认引发 RuntimeError;
raise 后接异常类型将会引发该类型的异常;
raise 后还可接异常的具体原因;
"""
手动设置异常通常是为了使用 try...except...
将其捕获并进行处理,这种设置可以保证程序的运行是正常的不会导致程序错误。
手动设置异常通常可以用于防止用户违规输入信息,通过 if
语句进行输入判定是否需要抛出异常进行相应处理。
12.4 获取异常信息
捕获异常时,有两种方式可以获得更多的异常信息:
1)使用 sys.exc_info()
或 sys.last_traceback()
;
2)使用 traceback
模块中的相关函数。
sys.exc_info()
方法会将当前异常信息以 (type, value, traceback)
的形式返回,分别为异常类型、异常实例以及 traceback
对象。 traceback
对象需要使用 traceback.print_tb()
进行读取,会输出产生异常的文件名、抛出异常的代码所在行以及具体代码。
在实际开发过程中,许多复杂功能的实现会由很多小函数组合而成,因此经常会发生一系列的函数或方法调用。当发生异常时,错误信息会从当前方法或函数向外传播至该函数的调用者,经过层层递进传递到解释器中,所以我们看到很多错误提示有很多行很多函数构成,这些也被称为【异常传播轨迹信息】。
实际上,异常信息传播轨迹信息记录了应用程序中执行停止的各个代码段,其最后一行详细显示了异常的类型及详细信息。
当程序处于 except
块中时,其捕获的异常信息可以通过 sys
对象进行获取,形式与 sys.exc_info()
方法返回的信息相似。
# import traceback
try:
...
except:
# 捕获异常并输出至控制台
traceback.print_exc([limit [, file]])
# 捕获异常并转换为字符串
traceback.format_exc()
"""
limit 用于限制传播层数,默认全部显示
file 将异常传播轨迹信息输出至文件
"""