文章目录
六、异常处理
Python的异常机制主要依赖try、except、else、finally、raise五个关键字,其中在try关键字后缩进的代码块简称try块,里面放置的是可能引发异常的代码;在except后对应的是异常类型和一个代码块,用于表明该except块处理的这种类型的代码块;在多个except后可以放一个else块,表明程序不出现异常时需要在执行else部分;最后添加finally块,总被执行;raise用于引发一个实际的异常,raise可以单独作为语句使用,引发一个具体的异常对象。
1、异常概述
错误处理机制两大缺点:
- 无法穷举所有的异常情况;
- 错误处理代码和业务实现代码混杂;
2、异常处理机制
2.1、使用try…except捕获
try:
# 业务实现代码
except (Error1, Error2, ... ): as e:
alert 输入不合法
goto retry
如果在执行try块里的业务逻辑代码时出现异常,系统自动生成一个异常对象,该异常对象被提交给Python解释器,过程被称之为引发异常。
当Python解释器收到异常对象时,会寻找能处理该异常对象的except块,如果找到合适的except块,则把该异常对象交给该except块处理,过程被称之为捕获异常。
如果无法捕获异常,则运行时环境终止,Python解释器退出。
InputInt = input("请输入整型数据:\n")
try:
if int(InputInt) >= 18:
print('成年!')
else:
print("未成年!")
except:
print('输入数据类型有误,请重新输入')
2.2、异常类的继承体系
当Python解释器接收到异常对象后,会依次判断该异常对象是否是except块后的异常类或其子类的实例,如果是,Python解释器将调用该except块来处理该异常;否则,再次拿该异常对象和下一个except块里的异常类进行比较。
Python捕获异常的流程图:
try:
statement1
statement1 # 出现异常生成异常对象ex
...
except Exception1:instance(ex, Exception1)
exception handler statement1
...
except Exception2:instance(ex, Exception2)
exception handler statement1
...
import sys
try:
a = int(sys.argv[1])
b = int(sys.argv[2])
c = a / b
print('两数相除的结果是:{0}'.format(c))
except IndexError:
print("索引错误,运行程序时输入的参数个数不够")
except ValueError:
print("数值错误,程序运行只能接受整数")
except ArithmeticError:
print("算数错误")
except Exception:
print("未知错误")
IndexError:输入的参数不够,将会发生索引错误;
ValueError:输入的参数不是数字,而是字母等,将会发生数值错误;
ArithmeticError:除0异常,将会发生算数错误;
Exception:其他异常;
2.3、多异常捕获
Python的一个except块可以捕获多种类型的异常。
在使用一个except块捕获多种类型的异常时,只要将多个异常类用圆括号括起来,中间用逗号隔开即可(构建多个异常类的元组)。
import sys
try:
a = int(sys.argv[1])
b = int(sys.argv[2])
c = a / b
print('两数相除的结果是:{0}'.format(c))
except (IndexError, ValueError, ArithmeticError):
print("索引错误/数值错误/算法错误")
except Exception:
print("未知错误")
2.4、访问异常信息
在except块中访问异常对象的相关信息,通过为异常对象声明变量来实现。
- args:该属性返回异常的错误编号和描述字符串;
- errno:返回异常的错误编号;
- strerror:返回异常的描述字符串;
- with_traceback():通过该方法可处理异常的传播轨迹信息;
def foo():
try:
fis = open("a.txt")
except Exception as e:
print(e.args)
foo() # (2, 'No such file or directory')
2.5、else块
当try没有出现异常时,程序会执行else块
s = input("请输入除数:\n")
try:
result = 20 / int(s)
print(result)
except ValueError:
print("输入数值错误")
else:
print('无异常')
2.6、使用finally回收资源
finally总会被执行,切必须放在所有except块之后。
s = '12'
try:
result = 20 / int(s)
print(result)
except ValueError:
print("输入数值错误")
else:
print('无异常')
finally:
print('结束')
2.7、异常处理嵌套
在finally块中包含了一个完整的异常处理流程
import os
def test():
fis = None
try:
fis = open("a.txt")
except OSError as e:
print(e.strerror)
return
finally:
if fis is not