为什么在Python中可以为未定义的异常使用except子句?

为什么在Python中可以为未定义的异常使用except子句?,python,Python,我的谷歌fu让我失望了。为什么下面的程序编译和运行时没有错误(Python2和3) 我想不出一个好的理由来解释为什么这不会导致错误。我知道它并没有执行那个except子句,所以并没有命中未定义的变量,但对我来说,它应该很容易理解。有人能给我解释一下吗?如果Python真的计算了那行代码,你肯定会得到错误。一旦出现异常,它就会看到此名称不存在文本列表不存在: >>> try: ... print(1/0) ... except ThisNameDoesNotExist:

我的谷歌fu让我失望了。为什么下面的程序编译和运行时没有错误(Python2和3)


我想不出一个好的理由来解释为什么这不会导致错误。我知道它并没有执行那个except子句,所以并没有命中未定义的变量,但对我来说,它应该很容易理解。有人能给我解释一下吗?

如果Python真的计算了那行代码,你肯定会得到错误。一旦出现异常,它就会看到
此名称不存在文本列表
不存在:

>>> try:
...     print(1/0)
... except ThisNameDoesNotExist:
...     print('blah')
... 
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
NameError: name 'ThisNameDoesNotExist' is not defined
>>试试:
...     打印(1/0)
... 除此之外,此名称不属于文本列表:
...     打印(‘废话’)
... 
回溯(最近一次呼叫最后一次):
文件“”,第3行,在
名称错误:未定义名称“ThisNameDoesNotExist”

否则,就不会有错误,Python的本质也是如此。

您基本上回答了自己的问题。一般来说,Python不会尝试计算任何东西,除非实际执行了计算它的代码行。由于没有引发异常,因此永远不会到达except行,因此不会计算未定义的名称。除了@BrenBarn所说的之外,解释器将只解析输入的语法。您还可以执行
除4之外的操作
除异常引发函数之外的操作()。在点击
except
块之前,Python无法检查名称是否存在,因为在执行
导入
或类定义或其他操作之前,名称可能不在名称解析链中的任何名称空间中。除了注释之外:使用任何可接受的IDE或只使用带有linter的文本编辑器,它将警告您未定义的变量(在您的情况下,是例外)。user2357112:我认为这是最好的答案,谢谢!
>>> try:
...     print(1/0)
... except ThisNameDoesNotExist:
...     print('blah')
... 
Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
NameError: name 'ThisNameDoesNotExist' is not defined