Python可以';无法捕获覆盖的名称错误

Python可以';无法捕获覆盖的名称错误,python,exception,overriding,nameerror,Python,Exception,Overriding,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>

你如何解释这一点:

此代码应该覆盖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
False
True
提供我想要的输出:

hi
原因是什么


谢谢

当您编写
除了namererror
之外的异常时,您的意思是希望捕获在捕获时所引用的
namererror
类型的异常。由于您更改了
namererror
的内容,因此您正在尝试捕获新类。但是引发的异常是一个“真实的”
namererror
,而不是覆盖的异常

如果修改except子句,则可以看到:

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

Traceback (most recent call last):
  File "try.py", line 6, in <module>
    ccc
NameError: name 'ccc' is not defined
False
True
。指示引发的异常是OldNameError,而不是新的NameError


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

为什么我不能更改引发的内容?它必须在某个地方定义,我应该能够覆盖它,不是吗?@EllaShar:它不是在Python代码中定义的。要更改它,您需要修改Python iTerpler本身。你为什么要这么做?谢谢。但是当我写
ccc
而它没有定义时会发生什么呢?python如何“知道”引发哪个异常?@EllaShar:正如我所说的,该行为内置于python解释器中。@EllaShar:如果有帮助,您可以想象在解释器开始运行您的任何代码之前,有一段代码引用了
namererror
类。然后使用该类引用而不是使用其名称引发异常。