Python可以';无法捕获覆盖的名称错误
你如何解释这一点: 此代码应该覆盖NameError,然后捕获它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>
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
类。然后使用该类引用而不是使用其名称引发异常。