python 为什么“except”语句中的无效异常名称不会立即导致NameError?

xzlaal3s  于 2023-01-19  发布在  Python
关注(0)|答案(2)|浏览(135)

请看下面这个例子,其中有一个故意的拼写错误:

try:
    print("Hello!")
    raise ValueError("?")
except ValueErro:
    print("Error!")
finally:
    print("World!")

对显式引发的ValueError的处理将导致NameError

Traceback (most recent call last):
  File "<stdin>", line 3, in <module>
ValueError: ?

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 4, in <module>
NameError: name 'ValueErro' is not defined

但是,如果ValueError引发:

try:
    print("Hello!")
except ValueErro:
    print("Error!")
finally:
    print("World!")

无异常发生;Hello!World!被简单地打印。

**为什么没有NameError**是因为拼写错误ValueErro(不存在这样的名称)?不应该提前检测到吗?

我可以使用不同的语法来确保提前捕获问题吗?

kxe2p93d

kxe2p93d1#

在@DYZ的评论后,我找到了合适的搜索词来获得答案。
https://docs.python.org/3/tutorial/errors.html#handling-exceptions
try语句的工作原理如下。

  • 首先,执行try子句(try和except关键字之间的语句)。
  • 如果未发生异常,则跳过except子句,并完成try语句的执行。

另一个资源探索这个问题。
https://dbaktiar-on-python.blogspot.com/2009/07/python-lazy-evaluation-on-exception.html

我的解决方案向前发展:

# Explicitly bind the Exception Names in a non-lazy fashion.
errors = (KeyboardInterrupt, ValueErro) # Caught!
try:
    print("Hello!")
    raise ValueError("?")
except errors:
    print("Error!")
finally:
    print("World!")

tl;dr -如果try子句执行时没有异常,则完全跳过except子句。

rekjcdws

rekjcdws2#

可以在运行时定义异常。例如:
myexcept.py contains:

class ValueErro(Exception):
    pass

您的程序略有修改:

import_myexcept = False
if import_myexcept:
    from myexcept import ValueErro

try:
    print("Hello!")
    raise ValueError("?")
except ValueErro:
    print("Error!")
finally:
    print("World!")

其行为与您的程序类似:NameError: name 'ValueErro' is not defined.
但是更改:import_myexcept = True,并且在遇到except ValueErro:语句时,ValueErro异常已定义,并且不会发生NameError。

相关问题