Py学习  »  Python

【免费赠书】Python是给自己的人生礼物 by 潘石屹

Python中文社区 • 4 年前 • 406 次点击  

本文文末赠书福利,敬请关注!

Python中完整的异常捕获机制

异常对象:程序可以使用异常对象在异常源和捕获代码之间传递信息。抛出异常时可以通过异常对象的构造函数参数为异常对象附带数据。这些数据可以在异常捕获代码中,使用关键字as为异常对象命名后通过args成员获得,如代码1所示。

代码1 except.py在抛出异常的同时传递信息

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
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

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49781
 
406 次点击