- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 管理函数和类
- 使用和定义装饰器
- 为什么使用装饰器
- 基础知识
- 类装饰器
- 装饰器嵌套
- 装饰器参数
- 装饰器管理函数和类
- 编写函数装饰器
- 状态信息保持选项
- 类错误之一:装饰类方法
- 计时调用
- 添加装饰器参数
- 编写类装饰器
- 跟踪对象接口
- 类错误之二:保持多个实例
- 装饰器与管理器函数的关系
- 为什么使用装饰器(重访)
- 直接管理函数和类
- 示例:私有 和 公有 属性
- 实现细节之一
- 使用dict 和 slots
- 公有声明的泛化
- 实现细节之二
- 开放问题
- Python不是关于控制
- 示例:验证函数参数
- 针对位置参数的一个基本范围测试装饰器
- 针对关键字和默认泛化
- 实现细节
- 开放问题
- 装饰器参数VS函数注解
- 其他应用程序:类型测试
- 本章小结
- 本章习题
- 习题解答
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
终止行为
最后,try语句可以说"finally",也就是说,它可以包含finally代码块。这看上去就像是异常的except处理器,但是try/finally的组合,可以定义一定会在最后执行时的收尾行为,无论try代码块中是否发生了异常。
在这里,如果try代码块完成后没有异常,finally代码块就会执行,而程序会在整个try后继续下去。在这个例子中,这条语句似乎有点笨:我们似乎也可以直接在函数调用后输入print,从而完全跳过try:
不过,这样编写会存在一个问题:如果函数调用引发了异常,就永远到不了print。try/finally组合可避免这种缺点:一旦异常确实在try代码块中发生时,当程序被层层剥开,将会执行finally代码块。
在这里,我们没有看到"after try?"消息,因为当异常发生时,控制权在try/finally代码块后中断了。与其相对比的是,Python跳回去执行finally的行为,然后把异常向上传播到前一个处理器(在这个例子中,就是顶层的默认处理器)。如果我们修改这个函数中的调用,使其不触发异常,则finally程序代码依然会执行,但程序就会在try后继续运行。
在实际应用中,try/except的组合可用于捕捉异常并从中恢复,而try/finally的组合则很方便,可以确保无论try代码块内的代码是否发生了任何异常,终止行为一定会运行。例如,可能使用try/except来捕捉从第三方库导入的代码所引发的错误,然后以try/finally来确保关闭文件,或者终止服务器连接的调用等行为一定会执行。这一部分稍后会看到实际应用的例子。
虽然从概念上讲是用于不同的用途,但是,在Python 2.5中,我们可以在同一个try语句内混合except和finally子句:finally一定会执行,无论是否有异常引发,而且也不管异常是否被except子句捕捉到。
我们将在下一章中看到,在使用某些类型的对象的时候,Python 2.6和Python 3.0提供了try/finally的一种替代。with/as运行一个对象的环境管理逻辑,来确保终止行为的发生:
尽管这个选项需要寥寥数行代码,它只是在处理某些对象类型的时候才适用,因此,try/finally是一种更加通用的终止结构。另一方面,with/as还运行启动操作并且支持用户定义的环境管理代码。
为什么要在意:错误检查
了解异常是多么有用的方法之一就是,比较Python以及没有异常的语言的代码风格。例如,如果想以C语言编写稳健的程序,一般得在每个可能出错的运算之后测试返回值或状态码,然后在程序执行时传递测试结果。
实际上,现实的C程序中,通常用于处理错误检测和用于实际工作的代码数量相当。但是,在Python中,你就不用那么谨小慎微和神经质。你可以把程序的任意片段包装在异常处理器内,然后编写从事实际工作的部分,假设一切都工作正常。
因为控制权在异常发生时就会立刻跳到处理器,没必要让所有代码都去预防错误的发生。再者,因为Python会自动检测错误,所以程序代码通常不需要事先检查错误。重点在于,异常让你大致上可以忽略罕见情况,并避免编写检查错误程序代码。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论