Python 类与异常

Python 类与异常,python,exception,Python,Exception,我正在浏览python中异常的文档:-() 我似乎找不到这个代码是如何工作的 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" 输

我正在浏览python中异常的文档:-()

我似乎找不到这个代码是如何工作的

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
B
B
“通行证”在课堂上做什么?只要浏览一下文档,我就可以得到所有类的对象(对象创建顺序:-B、C和D),并且在它们的名称中引发异常,如果是顺序,那么它解释了输出B、C、D

但是如果我们用除D之外的
替换
excpet B
,整个输出都会改变

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
C
D
B
B
B
这让我头晕目眩:/

“除了”的顺序如何改变输出


我知道我在文档中遗漏了一些东西,可能是因为不太清楚:(

由于
C
D
B
的子类,它们都被
除B
子句捕获。捕获异常时,您需要始终从最具体到最不具体地列出
子句,因为您的异常被应用的第一个子句捕获

从(我的)重点:

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

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

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

从语法上讲,docstring满足了
语句体中对语句的需求,但也提供了附加信息。

首先
除了匹配的
是执行的。因此,如果所有对象都是
B
的实例,并且您首先有
除了B:
,然后是另一个
例外甚至不考虑pt
s


关键字<代码> PASS <代码>只是一个无操作命令——它什么也不做。它只是因为Python源代码是基于缩进的,所以在爪哇或C++中,你可以把空函数/类体写为<代码> {}。

,在Python中,它是
pass

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

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