核心知识点:

(1)无论try块是否发生异常,都可以使用try/finally复合语句中地finally块来执行清理工作。

(2)顺利运行try块后,若想使某些操作能在finally块地清理代码之前执行,则可将这些操作写入到else块中

Python程序的异常处理可能要考虑四种不同的时机。这些时机可以用try、expect、else和finally块来表述。

复合语句中的每个块都有特定的用途,它们可以构成很多种有用的组合方式。

1.finally块

如果既要将异常向上传播,又要在异常发生时执行清理工作,那就可以使用try/finally结构。

这种结构有一项常见的用途,就是确保程序能够可靠地关闭文件句柄。

>>> handle = open('/tmp/my_file.txt')
>>> try:
... data = handle.read()
... finally:
... handle.close()

上面这段代码中,read方法所抛出的异常会向上传播给调用方,而finally块中的handle.close()方法则一定能够执行。

open方法必须放在try块外面,应为如果打开文件时发生异常,那么程序应该跳过finally块。

2.else块

try/expect/else结构可以清晰地描述出那些异常会由自己的代码来处理,那些异常会传播到上一级。

如果try'块没有发生异常,那么就执行else块。有了这种else块,我们可以尽量缩减try块内的代码量,使其更加易懂。

例如,要从字符串中加载JSON字典数据,然后返回字典里某个键所对应地值。

>>> def load_json_key(data,key):
... try:
... result_dict = json.loads(data)
... except ValueError as e:
... raise KeyError from e
... else:
return result_dict[key]

如果数据不是有效地JSON格式,那么用json.loads解码时,会产生ValueError。这个异常会由except块来捕获并处理。

如果能够解码,那么else块里地查找语句就会执行,它会根据键来查出相关地值。查询时若有异常,则该异常会向上传播,因为查询语句并不在刚才那个try块地范围内。

这种else子句,会把try/except后面地内容和except块本身区分开来,使异常地传播行为变得更加清晰。

3.混合使用

如果要在复合语句中把上面几种机制都用到,那就编写完整地try/except/else/fianally结构。

例如,要从文件中读取某项事务地描述信息,处理该事务,然后就地更新该文件。

为了实现本功能,我们可以用try块来读取文件并处理其内容,用except块来应对try中可能发生地相关问题,

用else块实时地更新文件并把更新中可能出现地问题回报给上级代码,然后用finally块来清理文件句柄。

UNDEFINED = object()

def divide_json(path):
handle = open(path,'r+')
try:
data = handle.read()
op = json.loada(data)
value = (
op['numerator'] /
op['denominator'])
except ZeroDivisionError as e:
return UNDEFINED
else:
op['result'] = value
result = json.dumps(op)
handle.seek(0)
handle.write(result)
return value
finally:
handle.close()

这种写法很有用,因为这四块代码相互配合非常到位。

文章摘抄于Brett Slatkin的《编写高质量Python代码的59个有效方法》,仅作为个人学习使用,如有侵权请告知,将及时删除,如果觉得有益,请购买原版书籍,知识需要传递和支持,谢谢。

第13条:合理利用try/expect/else/finally结构中的每个代码块的更多相关文章

  1. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  2. 测试脚本配置、ORM必知必会13条、双下划线查询、一对多外键关系、多对多外键关系、多表查询

    测试脚本配置 ''' 当你只是想测试django中的某一个文件内容 那么你可以不用书写前后端交互的形式而是直接写一个测试脚本即可 脚本代码无论是写在应用下的test.py还是单独开设py文件都可以 ' ...

  3. Django ORM 操作 必知必会13条 单表查询

    ORM 操作 必知必会13条 import os # if __name__ == '__main__': # 当前文件下执行 os.environ.setdefault('DJANGO_SETTIN ...

  4. 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:

    MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...

  5. Django框架之第六篇(模型层)--单表查询和必知必会13条、单表查询之双下划线、Django ORM常用字段和参数、关系字段

    单表查询 补充一个知识点:在models.py建表是 create_time = models.DateField() 关键字参数: 1.auto_now:每次操作数据,都会自动刷新当前操作的时间 2 ...

  6. 13条必知必会&&测试

    1.13条必知必会 <> all(): 查询所有结果 <> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <> get(**kwargs) ...

  7. Django ORM单表查询必会13条

    必知必会13条 操作下面的操作之前,我们实现创建好了数据表,这里主要演示下面的操作,不再细讲创建准备过程 <1> all(): 查询所有结果 <2> filter(**kwar ...

  8. 13 条高效实用的 JavaScript 单行代码

    JavaScript可以实现很多令人惊奇的事! 从复杂的框架到处理API,有太多的东西可以学习. 甚至,仅用一行代码,它也能完成一些很棒的工作. 不信?那么请看这13条JavaScript单行代码,用 ...

  9. 利用Python中的mock库对Python代码进行模拟测试

    这篇文章主要介绍了利用Python中的mock库对Python代码进行模拟测试,mock库自从Python3.3依赖成为了Python的内置库,本文也等于介绍了该库的用法,需要的朋友可以参考下     ...

随机推荐

  1. OpenStack二三事(1)

    更新系列不是教材,不说教,不讲道理,仅仅记录. OpenStack在云计算领域大热,没有理由不去了解它. 先说说我对OpenStack的感觉,开源.廉价.麻烦.大家都在用,在了解开发流程后.OpenS ...

  2. ionic2项目创建回顾 及 react-native 报错处理

    ionic2: 1.创建项目: ionic start MyIonic2Project tutorial --v2 (下载 tutorial 模板来初始化项目) ionic start MyIonic ...

  3. STL学习笔记(迭代器相关辅助函数)

    advance()可令迭代器前进 #include <iterator> void advance(InputIterator& pos,Dist n); 面对Random Acc ...

  4. PHP面试题及答案解析(7)—Linux系统命令

    1.请解释下列10个shell命令的用途.top.ps.mv.find.df.cat.chmod.chgrp.grep.wc top:该命令提供了实时对系统处理器状态的监控,它能够实时显示系统中各个进 ...

  5. Windows App开发之编辑文本与绘制图形

    编辑文本及键盘输入 相信大家都会使用TextBox,但假设要让文本在TextBox中换行该怎么做呢?将TextWrapping属性设置为Wrap,将AcceptsReturn属性设置为True就好咯. ...

  6. sprint3 【每日scrum】 TD助手站立会议第十天

    站立会议 组员 昨天 今天 困难 签到 刘铸辉 (组长) 团队进入最终的功能测试阶段,准备发布Beta版 和团队发布Beta版,并开总结会议 总结会议 Y 刘静 团队集合软件测试 软件发布 没有 Y ...

  7. atom无法安装插件的解决方法

    atom通过setting中无法下载插件,通过apm也无法下载插件,可能是网络.config配置的问题,不好解决. 下面的方法全手动,基本属于万金油方法: 1,在atom的setting页面中点击op ...

  8. 使用OSChina代码托管管理项目(四)

    本篇主要介绍使用Eclipse的Egit插件克隆远程project到本地的操作步骤 一.在Git资源库管理视图中新建一个远程资源库位置 点击红框中button进行加入 二.输入远程资源库相关信息.选择 ...

  9. 基于 ZooKeeper 搭建 Hadoop 高可用集群

    一.高可用简介 二.集群规划 三.前置条件 四.集群配置 五.启动集群 六.查看集群 七.集群的二次启动 一.高可用简介 Hadoop 高可用 (High Availability) 分为 HDFS ...

  10. oracle查看用户有哪些权限和角色

    select * from dba_sys_privs t where t.grantee='HR';select * from dba_role_privs t where t.grantee='H ...