你怎么解释:
这段代码应该覆盖NameError,然后捕获它。
OldNameError = NameError
class NameError(OldNameError):
pass
try:
ccc
except NameError as e:
print "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
怎么解释?
谢谢!
最佳答案
当您编写except NameError
时,您是说您希望捕获在执行捕获时NameError
所指的任何类型的异常。既然你改变了NameError
是什么,你就试图赶上你的新班级。但引发的异常是“real”NameError
,而不是重写的异常。
如果修改except子句,您可以看到这一点:
try:
ccc
except Exception as e:
print isinstance(e, NameError)
print isinstance(e, OldNameError)
输出为:
False
True
. . . 表示引发的异常是OldNameError,而不是new NameError。
无法更改由于未定义的名称而引发的异常类型。您可以创建一个名为NameError的东西,但是除非您自己显式地使用它(如您在第二个示例中所做的那样),否则将永远不会使用它。