本节介绍在Python中进行异常处理的方法。[大谦MATLAB,dqmatlab点com]
常见异常
Python中常见的异常如表16-1所示。对于不同类型的错误,Python给它们指定了名称。编程过程中如果出现错误,可以捕获该错误并判断是否指定类型的错误并进行对应的处理。
表16-1 Python常见异常
| 异 常 | 说 明 |
|---|---|
| ArithmeticError | 算术运算引发的错误 |
| FloatingPointError | 浮点计算错误 |
| OverflowError | 因为计算结果过大导致的溢出错误 |
| ZeroDivisionError | 除数为0 |
| AttributeError | 属性引用或赋值失败导致的错误 |
| BufferError | 无法执行与缓冲区相关的操作时引发的错误 |
| ImportError | 导入模块/对象失败导致的错误 |
| ModuleNotFoundError | 没有找到模块或在在sys.modules中找到None |
| IndexError | 序列中没有此索引 |
| KeyError | 映射中没有这个键 |
| MemoryError | 内存溢出错误 |
| NameError | 对象未声明或未初始化导致的错误 |
| UnboundLocalError | 访问未初始化的本地变量导致的错误 |
| OSError | 操作系统错误 |
| FileExistsError | 创建已存在的文件或目录导致的错误 |
| FileNotFoundError | 使用不存在的文件或目录导致的错误 |
| InterruptedError | 系统调用被输入信号中断导致的错误 |
| IsADirectoryError | 在目录上请求文件操作导致的错误 |
| NotADirectoryError | 在不是目录的对象上请求目录操作导致的错误 |
| TimeoutError | 系统函数在系统级别超时 |
| RuntimeError | 运行时错误 |
| SyntaxError | 语法错误 |
| SystemError | 解释器发现内部错误 |
| TypeError | 对象类型错误 |
异常捕获-单分支的情况
Python中使用try…except…else…finally…这样的结构捕获异常,根据需要可以使用简单的单分支形式,也可以使用多分支、带else和带finally等各种形式。
首先介绍单分支的情况。单分支捕获异常的语法格式为:
try:
<语句>
except:
print('异常说明')
或
try:
<语句>
except <异常名>:
print('异常说明')
第一种形式捕获所有错误,第二种形式捕获指定错误。其中,try部分正常执行指定代码,except部分捕获错误并进行相关显示和处理。一般尽量避免使用第一种形式,或者在多分支情况下处理未知错误。
下面的代码,try部分试图使用一个没有声明和赋值的变量,用except捕捉NameError类型的错误并输出。
>>> try:
f
except NameError as e:
print(e)
回车,因为使用了没有声明的变量,捕获到“名称f没有定义”的错误,即。输出为:
name 'f' is not defined
异常捕获-多分支的情况
如果捕捉到的错误可能属于几种类型,用多分支的形式进行处理。多分支情况下的语法格式可以是:
try:
<语句>
except(<异常名1>, <异常名2>, ...):
print('异常说明')
下面这段代码执行除法运算,如果出现错误,捕捉除数为0的错误和变量未定义的错误,在except语句中用元组指定这两个错误的名称,然后输出捕捉到的错误结果。
>>> b=0
>>> try:
3/b
except(ZeroDivisionError,NameError) as e:
print(e)
回车,输出捕捉到的错误为除数为0,即
division by zero
多分支的情况也可以写成下面的形式,按照先后顺序进行判断。
try:
<语句>
except <异常名1>:
print('异常说明1')
except <异常名2>:
print('异常说明2')
except <异常名3>:
print('异常说明3')
改写上面的示例代码,如下所示。
>>> try:
3/0
except ZeroDivisionError as e:
print(e)
except NameError as e:
print(e)
回车得到相同的输出结果。
division by zero
异常捕获-try…except…else…
单分支和多分支的情况捕获错误并进行处理,如果没有捕获到错误怎么处理呢?这就用到本小节介绍的try…except…else…结构,如下所示。其中,else部分在没有发现异常时进行处理。
try:
<语句>
except <异常名1>:
print('异常说明1')
except <异常名2>:
print('异常说明2')
else:
<语句>
下面的代码计算3/2,没有捕获到错误时输出一系列等号。
>>> b=2
>>> try:
3/b
except(ZeroDivisionError,NameError) as e:
print(e)
else:
print('==========')
回车,计算结果为1.5,没有出错,输出一系列等号。
1.5
==========
异常捕获-try…finally…
try...finally...结构在无论是否发生异常的情况下都会执行finally部分的代码。其语法格式如下所示。
try:
<语句>
finally:
<语句>
下面的示例代码中,计算3/0,因为除数为0,except部分会捕获到除数为0的错误,输出出错信息。但是即使出错,也会执行finally部分的代码进行处理。
>>> try:
3/0
except ZeroDivisionError as e:
print(e)
finally:
print("执行finally")
回车,输出下面的结果,第1条为除数为0的出错信息,第2条为finally部分的输出结果。
division by zero
执行finally