有例外的类

时间:2014-05-14 14:28:22

标签: python exception

我正在浏览python中的异常文档: - (https://docs.python.org/2/tutorial/classes.html#exceptions-are-classes-too

我似乎无法找到此代码的工作方式

class B:
     pass
class C(B):
     pass
class D(C):
     pass  

for c in [B, C, D]:
    try:
        raise c()
    except D:
        print "D"
    except C:
        print "C"
    except B:
        print "B"

输出: -

B
C
D

""传递"在课堂上做什么?只需查看文档,我就可以获得所有类的对象(对象创建顺序: - B,C和D),并在其名称中引发异常,如果这是订单,那么它解释了输出B,C,D。

但是如果我们用excpet B替换except D,则整个输出会发生变化。

class B:
     pass
class C(B):
     pass
class D(C):
     pass  

for c in [B, C, D]:
    try:
        raise c()
    except B:
        print "B"
    except C:
        print "C"
    except D:
        print "D"

输出: -

B
B
B

现在这让我头晕目眩:/

除了"""的顺序如何?改变输出?

我知道我遗漏了文档中的内容,可能是因为它不是很清楚:(

3 个答案:

答案 0 :(得分:9)

由于CDB的子类,因此它们都被except B子句捕获。捕获异常时,您需要始终列出从最常见到最不具体的except子句,因为您的异常会被第一个适用的异常捕获。

来自documentation(强调我的):

  

except子句指定一个或多个异常处理程序。当try子句中没有异常发生时,不执行异常处理程序。当try套件中发生异常时,将启动对异常处理程序的搜索。 此搜索依次检查except子句,直到找到与该异常匹配的子句。无表达式的except子句(如果存在)必须为last;它匹配任何异常。对于带有表达式的except子句,将计算该表达式,如果结果对象与异常“兼容”,则子句匹配该异常。 如果对象是异常对象的类或基类,或者包含与异常兼容的项的元组,则该对象与异常兼容。

pass语句用于需要语句的地方,但不需要任何其他语句。 class语句不能有空体,但通常最好使用docstring。

class B:
    """An exception that signals an error occurred"""

从语法上讲,docstring填充了class语句体内语句的需要,但也提供了其他信息。

答案 1 :(得分:1)

匹配的第一个except是执行的B。因此,如果所有对象都是except B:的实例,并且您首先有except,那么其他pass甚至不会被考虑。

关键字{}只是一个无操作命令 - 它什么都不做。它只是因为必须有一些东西,因为Python源代码是基于缩进的。在Java或C ++中,您可以将空函数/类体写为pass,在Python中它是{{1}}。

答案 2 :(得分:0)

在我看来,你的except语句的顺序很重要,因为Python将遵循它看到的第一个真正的except语句的异常逻辑。

在第一个例子中,第一行输出将是B,因为B类不是C或D的子类。在第二个例子中,所有输出都是B,因为每个类都是B的子类。 / p>