Python无法捕获重写的NameError

时间:2014-02-15 20:57:13

标签: python exception override nameerror

你怎么解释这个:

此代码应该覆盖NameError然后捕获它。

OldNameError = NameError
class NameError(OldNameError):
    pass

try:
    ccc
except NameError as e:
    print "hi"

不打印“hi”。 相反,输出是:

Traceback (most recent call last):
  File "try.py", line 6, in <module>
    ccc
NameError: name 'ccc' is not defined

但是这段代码:

OldNameError = NameError
class NameError(OldNameError):
    pass

try:
    raise NameError("oo")
except NameError:
    print "hi"

提供我想要的输出:

hi

解释是什么?

谢谢!

1 个答案:

答案 0 :(得分:3)

当您编写except NameError时,您表示要捕获在执行捕获时NameError引用的任何类型的异常。由于您更改了NameError的内容,因此您正试图抓住新课程。但引发的例外情况是“真实的”NameError,而不是你的重写。

如果修改了except子句,可以看到这个:

try:
    ccc
except Exception as e:
    print isinstance(e, NameError)
    print isinstance(e, OldNameError)

输出结果为:

False
True

。 。 。指示引发的异常是OldNameError,而不是新的NameError。

您无法更改由于名称未定义而引发的异常类型。您可以创建名为 NameError的,但除非您自己明确使用它,否则它将永远不会被使用(正如您在第二个示例中所做的那样)。