Python异常(文档示例)

时间:2016-03-30 04:18:32

标签: python class exception

以下是python documentation处理异常处理和类的代码示例。我正在努力理解这两个,我的背景是Java,所以我习惯强类型和变量。有人请详细解释这里发生了什么吗?

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的实例,或者只创建了一个类类型。如果它们只是类类型,我认为它们是在for c in [B, C, D]:中实现的。如何在没有参数的情况下实例化C类和D类的实例?那么异常的东西是怎么回事?

3 个答案:

答案 0 :(得分:1)

前六行定义了类。它们在没有参数的情况下被实例化,例如class C(B):表示类C B继承,而不是C的实例化需要传递参数。这在documentation on classes

中有解释

每次循环时,解释器都会引发给定类的错误。它将打印引发的任何类型的异常类,B用于B,依此类推。正如您在运行该代码时看到的那样,输出为B,然后是C,然后是D,因为这些是按顺序引发的异常类,就像您一样请参阅循环迭代的[B, C, D]

答案 1 :(得分:1)

前六行创建类。我喜欢将它们视为稍后将创建的实例的定义。使用for c in [B, C, D]: 实例化任何内容;它只是为cBC分配D,它们仍然只是类。对于第一次迭代,cB相同。因此,当您说raise c()时,c()会生成B的实例并将其作为例外引发。该异常在except B:块中捕获并导致print "B"行执行。对于下一次迭代,c被分配到[B, C, D]C中的下一个值。现在,raise c()生成C的实例并将其作为例外引发。该异常在except C:块中捕获,并执行print "C"行。同样的事情发生在D

答案 2 :(得分:0)

前六行正在创建类类型。

因为python中的所有内容都可以分配给变量,所以这包括函数,类(不仅仅是该类的实例化对象)for c in [B, C, D]:正在执行的操作。

最后,try:中的异常首先通过创建它的实例来尝试引发类型c的异常。因此,它首先引发类型B的异常,然后键入C,然后键入D.

except用于捕获每种类型的异常。在python 2中,任何对象都可以作为异常引发,这与python 3不同,其中引发的所有异常必须从类型BaseException派生