返回介绍

第34章 异常对象

发布于 2024-01-29 22:24:14 字数 1480 浏览 0 评论 0 收藏 0

到目前为止,本书有意模糊了异常这个概念。Python把异常的概念一般化。就像上一章中所描述的,在Python 2.6和Python 3.0中,内置异常和用户定义的异常都可以通过类实例对象来表示。尽管这意味着,你必须使用面向对象编程来在程序中定义新的异常,类和OOP通常提供了几种优点。

基于类的异常有如下特点。

·提供类型分类,对今后的修改有更好的支持。以后增加新异常时,通常不需要在try语句中进行修改。

·它们附加了状态信息。异常类提供了存储在try处理器中所使用的环境信息的合理地点:这样的话,可以拥有状态信息以及可调用的方法,并且可以通过实例进行读取。

·它们支持继承。基于类的异常允许参与继承层次,从而可以获得并定制共同的行为。例如,继承的显示方法可提供通用的出错消息的外观。

因为有这些差异,所以基于类的异常支持了程序的演进和较大系统,事实上,所有内置异常都是类组织成继承树,其原因就是刚才所说的。也可以对用户定义的异常做相同的事。

在Python 3.0中,用户定义的异常继承自内置异常超类。正如我们将在这里介绍的,由于这些超类为打印和状态保持提供了有用的默认值,所以编写用户定义的异常的任务也涉及理解这些内置超类的作用。

注意:版本差异提示:Python 2.6和Python 3.0都要求异常通过类来定义。此外,Python 3.0要求异常类派生自BaseException内置异常超类,而不管是直接还是间接。正如我们将看到的,大多数程序都继承自这个类的Exception子类,以支持针对常规异常类型的全捕获处理器——在一个处理器中指定它将会捕获大多数程序应该捕获的所有内容。Python 2.6也允许独立的标准类来充当异常,但是,它要求新式类派生自内置异常类,这与Python 3.0相同。

异常:回到未来

曾经(在Python 2.6和Python 3.0之前)可以以两种不同的方式来定义异常。这通常使得try语句、raise语句和Python复杂化。如今,只有一种方式来定义异常。这是件好事情:它从语言中删除了为了实现向后兼容而保留的大量冗余内容。由于旧的方式有助于说明为什么异常成为今天的样子,并且,由于真的不可能完全擦除上百万人使用了近二十年的教程的历史,所以让我们先来简单看看异常的过去。

字符串异常很简单

在Python 2.6和Python 3.0之前,可以使用类实例和字符串对象来定义异常。基于字符串的异常在Python 2.5中就发布了废弃警告,并且在Python 2.6和Python 3.0中删除了,因此,今天你应该使用基于类的异常,就像本书中所介绍的那样。如果你使用遗留代码,可能还会遇到字符串异常。它们也可能会出现在几年前(这在Python的纪年中应该算作是不朽了)编写的教程和Web资料中。

字符串异常很容易使用——任何字符串都可以做到,它们根据对象标识来匹配,而不是根据值(也就是说,使用is,而不是==):

对于较大的程序和代码维护来说,这种形式并不像类那么好,因此,删除了它。尽管你如今不能使用字符串异常,但它们实际上提供了一种自然的工具来引入基于类的异常模式。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文