你怎么解释:
这段代码应该覆盖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的东西,但是除非您自己显式地使用它(如您在第二个示例中所做的那样),否则将永远不会使用它。

10-08 02:32