- 译者序
- 前言
- 第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章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
类异常例子
这段代码相当直接,但是,这里有一些实现细节需要注意:
Exception超类
用来构建异常分类树的类拥有很少的需求——实际上,在这个例子中,它们主要是空的,其主体不做任何事情而直接通过。注意,这里顶层的类是如何从内置的Exception类继承的。这在Python 3.0中是必需的;Python 2.6也允许独立的经典类充当异常,但是,它要求新式类派生自内置异常类,这和在Python 3.0中一样。由于Exception提供了一些有用的行为,我们随后才会遇到这些行为,因此,在这里不能使用它们;但是,在任何Python版本中,从它那里继承是个好主意。
引发实例
在这段代码中,我们调用类来创建raise语句的实例。在类异常模式中,我们总是引发和捕获一个类实例对象。如果我们在一个raise中列出了类名而没有圆括号,那么Python调用该类而没有构造函数参数为我们产生一个实例。异常实例可以在该raise之前创建,就像这里所做的一样,或者在raise语句自身中创建。
捕获分类
这段代码也包含一些函数,引发三个类实例使其成为异常,此外,有个顶层try会调用那些函数,并捕捉General异常(同一个try也会捕捉两个特定的异常,因为它们是General的子类)。
异常细节
我们会在下一章再谈这里所用到的异常处理器sys.exc_info调用:这是一种抓取最近发生异常的常用方式。简而言之,对基于类的异常而言,其结果中的第一个元素就是引发异常类,而第二个是实际引发的实例。这里的except子句捕获了一个分类中所有的类,在这样的一条通用的except子句中,sys.exc_info是决定到底发生了什么的一种方式。在这一特别的情况下,它等价于获取实例的__class__属性。
正如我们将在下一章中看到的,sys.exc_info方法通常也与捕获所有内容的空的except子句一起使用。最后一点值得进一步说明。当捕获了一个异常,我们可以确定该实例是except中列出的类的一个实例,或者是其更具体的子类中的一个。因此,实例的__class__属性也给出了异常类型。例如,如下的变体和前面的例子起着同样的作用:
由于__class__可以像这样使用来决定引发的异常的具体类型,因此sys.exc_info对于空的except子句更有用,否则的话,没有一种方式来访问实例及其类。此外,更实用的程序通常根本不必关注引发了哪个具体的异常——通过一般调用实例的方法,我们自动把修改后的行为分派给引发的异常。下一章更多地介绍这一点以及sys.exc_info;如果你已经忘记了实例中的__class__的含义,请参见第28章以及第六部分的大部分内容。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论