Python中的异常处理

本节介绍在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等各种形式。

首先介绍单分支的情况。单分支捕获异常的语法格式为:

code.python
try:
    <语句>
except:
    print('异常说明')

code.python
try:
    <语句>
except <异常名>:
    print('异常说明')

第一种形式捕获所有错误,第二种形式捕获指定错误。其中,try部分正常执行指定代码,except部分捕获错误并进行相关显示和处理。一般尽量避免使用第一种形式,或者在多分支情况下处理未知错误。

下面的代码,try部分试图使用一个没有声明和赋值的变量,用except捕捉NameError类型的错误并输出。

code.python
>>> try:
	    f
except NameError as e:
	print(e)

回车,因为使用了没有声明的变量,捕获到“名称f没有定义”的错误,即。输出为:

code.python
name 'f' is not defined

异常捕获-多分支的情况

如果捕捉到的错误可能属于几种类型,用多分支的形式进行处理。多分支情况下的语法格式可以是:

code.python
try:
    <语句>
except(<异常名1>, <异常名2>, ...):
    print('异常说明')

下面这段代码执行除法运算,如果出现错误,捕捉除数为0的错误和变量未定义的错误,在except语句中用元组指定这两个错误的名称,然后输出捕捉到的错误结果。

code.python
>>> b=0
>>> try:
	   3/b
except(ZeroDivisionError,NameError) as e:
    print(e)

回车,输出捕捉到的错误为除数为0,即

code.python
division by zero

多分支的情况也可以写成下面的形式,按照先后顺序进行判断。

code.python
try:
    <语句>
except <异常名1>:
    print('异常说明1')
except <异常名2>:
    print('异常说明2')
except <异常名3>:
    print('异常说明3')

改写上面的示例代码,如下所示。

code.python
>>> try:
3/0
except ZeroDivisionError as e:
    print(e)
except NameError as e:
    print(e)

回车得到相同的输出结果。

code.python
division by zero

异常捕获-try…except…else…

单分支和多分支的情况捕获错误并进行处理,如果没有捕获到错误怎么处理呢?这就用到本小节介绍的try…except…else…结构,如下所示。其中,else部分在没有发现异常时进行处理。

code.python
try:
    <语句>
except <异常名1>:
    print('异常说明1')
except <异常名2>:
    print('异常说明2')
else:
    <语句>

下面的代码计算3/2,没有捕获到错误时输出一系列等号。

code.python
>>> b=2
>>> try:
    3/b
except(ZeroDivisionError,NameError) as e:
    print(e)
else:
    print('==========')

回车,计算结果为1.5,没有出错,输出一系列等号。

code.python
1.5
==========

异常捕获-try…finally…

try...finally...结构在无论是否发生异常的情况下都会执行finally部分的代码。其语法格式如下所示。

code.python
try:
    <语句>
finally:

<语句>

下面的示例代码中,计算3/0,因为除数为0,except部分会捕获到除数为0的错误,输出出错信息。但是即使出错,也会执行finally部分的代码进行处理。

code.python
>>> try:
    3/0
except ZeroDivisionError as e:
    print(e)
finally:
    print("执行finally")

回车,输出下面的结果,第1条为除数为0的出错信息,第2条为finally部分的输出结果。

code.python
division by zero
执行finally