返回介绍

类异常例子

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

让我们看一个例子,看看在代码中类异常是如何应用的。下列classexc.py文件中,我们定义一个名为General的超类,以及两个子类Specific1和Specific2。这个例子说明异常分类的概念:General是分类的名称,而其两个子类是这个分类中特定种类的异常。捕捉General的处理器也会捕捉其任何子类,包括Specific1和Specific2。

这段代码相当直接,但是,这里有一些实现细节需要注意:

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 技术交流群。

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

发布评论

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