Python中完整的异常捕获机制
异常对象:程序可以使用异常对象在异常源和捕获代码之间传递信息。抛出异常时可以通过异常对象的构造函数参数为异常对象附带数据。这些数据可以在异常捕获代码中,使用关键字as为异常对象命名后通过args成员获得,如代码1所示。
代码1 except.py在抛出异常的同时传递信息
try:
raise Exception('arg1', [1,2,3])
except Exception as e:
x, y = e.args
print('x =', x)
print('y =', y)
【程序运行结果】
$ python3 except_obj.py
x = arg1
y = [1, 2, 3]
finally子句:可以使用finally关键字为try-except设置结束行为。其语法如图1所示。
图1 异常finally子句
放置在finally子句中的代码一定会被执行,无论是否有异常发生。finally子句用于执行必需的清理工作,比如释放try子句中分配的资源,如代码2所示。
代码2 代码段:用finally子句关闭文件
fp = None
try:
fp = open('demo.txt')
...
except FileNotFoundError:
...
except ... :
...
finally:
if fp: # 如果成功打开了文件
fp.close() # 则关闭文件
with关键字:为了减少try-finally的使用频率,Python引入了with关键字和上下文管理器模式。其语法如图2所示。
图2 上下文管理器对象和with的用法
其中,expression的求值结果是一个上下文管理器对象(Context manager object)①。如果要在with语句块中访问该对象,就使用as关键字为该对象绑定至左值target。with结构执行结束后,上下文管理器对象的exit()方法一定会被调用(即使with语句块出现异常)。文件句柄是上下文管理器对象。利用with语句可以将上述例子简写为代码3的形式。
代码3 代码段:用with自动关闭文件
try:
with open('demo.txt') as fp:
...
except FileNotFoundError:
...
except ... :
...
else子句:在try-except结构后的可选else子句在try正常结束后执行,如图3所示。
图3 异常else子句
使用else子句与直接将代码置于try子句结尾的区别在于,前者代码产生的异常不会被except捕获。①
①上下文管理器对象是指实现了上下文管理协议(enter__()和__exit()方法)的对象。
综述:综合异常对象、else和finally子句的异常捕获机制如图4所示。
图4 整合的异常处理图
本文送书《Python编程从0到1(视频教学版)》。以Python语言构建了程序设计基础课程的教学体系。本书在对程序设计核心方法的探讨上较其他Python书籍更为全面和深入。通过对本书内容的系统学习,读者将全面掌握用Python进行程序设计的基本能力。
活动参与方式:在文章底部留言,说说你为什么学习Python。点赞数最高前 8 名将赠送《Python编程从0到1(视频教学版)》图书一本。
活动时间:即日起截止11月18日中午12:00中奖
领取方式:点赞数最多的前8 名,请添加工作人员微信:pythonpost,之后回复详细邮寄信息(姓名、手机、地址),之后会尽快给您寄送图书。
Python中文社区作为一个去中心化的全球技术社区,以成为全球20万Python中文开发者的精神部落为愿景,目前覆盖各大主流媒体和协作平台,与阿里、腾讯、百度、微软、亚马逊、开源中国、CSDN等业界知名公司和技术社区建立了广泛的联系,拥有来自十多个国家和地区数万名登记会员,会员来自以工信部、清华大学、北京大学、北京邮电大学、中国人民银行、中科院、中金、华为、BAT、谷歌、微软等为代表的政府机关、科研单位、金融机构以及海内外知名公司,全平台近20万开发者关注。
▼ 点击成为社区注册会员 「在看」一下,一起PY