你怎么解释这个:
此代码应该覆盖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
解释是什么?
谢谢!
答案 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的,但除非您自己明确使用它,否则它将永远不会被使用(正如您在第二个示例中所做的那样)。