编程语言
首页 > 编程语言> > Python无法捕获重写的NameError

Python无法捕获重写的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>
    ccc
NameError: name 'ccc' is not defined

但是这段代码:

OldNameError = NameError
class NameError(OldNameError):
    pass

try:
    raise NameError("oo")
except NameError:
    print "hi"

给出我想要的输出:

hi

有什么解释?

谢谢!

解决方法:

当您编写除NameError之外的代码时,是说您要捕获执行捕获时NameError所指类型的异常.由于更改了NameError是什么,因此您尝试捕获新的类.但是引发的异常是“真实的” NameError,而不是您覆盖的错误.

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

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

输出为:

False
True

. . .指示引发的异常是OldNameError,而不是新的NameError.

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

标签:nameerror,exception,override,python
来源: https://codeday.me/bug/20191122/2057107.html