有例外的类

Bad*_*der 5 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"
Run Code Online (Sandbox Code Playgroud)

输出: -

B
C
D
Run Code Online (Sandbox Code Playgroud)

什么是"通过"在课堂上做什么?只需浏览文档,我就可以获得所有类的对象(对象创建顺序: - B,C和D),并在其名称中引发异常,如果是顺序则说明输出B,C ,d.

但是如果我们excpet Bexcept 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"
Run Code Online (Sandbox Code Playgroud)

输出: -

B
B
B
Run Code Online (Sandbox Code Playgroud)

现在这让我头晕目眩:/

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

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

che*_*ner 9

由于CD是子类B,它们都被该except B子句捕获.捕获异常时,您需要始终列出except从最大到最不具体的子句,因为您的异常会被第一个应用的异常捕获.

文档(强调我的):

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

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

class B:
    """An exception that signals an error occurred"""
Run Code Online (Sandbox Code Playgroud)

从语法上讲,docstring填充了语句正文中的class语句需求,但也提供了其他信息.