【问题标题】:Python Exceptions (Documentation Example)Python 异常(文档示例)
【发布时间】:2016-07-17 21:53:59
【问题描述】:

下面是来自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 的实例如何在没有参数的情况下实例化?那么异常的东西是怎么回事呢?

【问题讨论】:

    标签: python class exception


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        前六行是创建类类型。

        由于python中的所有东西都可以分配给一个变量,这包括for c in [B, C, D]:正在做的函数、类(不仅仅是该类的实例化对象)。

        最后,异常在try: 中首先做了什么,它试图通过创建一个实例来引发c 类型的异常。因此,它首先引发 B 类型的异常,然后是 C 类型,然后是 D 类型。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-03
          • 1970-01-01
          相关资源
          最近更新 更多