请看下面这个例子,其中有一个故意的拼写错误:
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
(不存在这样的名称)?不应该提前检测到吗?
我可以使用不同的语法来确保提前捕获问题吗?
2条答案
按热度按时间kxe2p93d1#
在@DYZ的评论后,我找到了合适的搜索词来获得答案。
https://docs.python.org/3/tutorial/errors.html#handling-exceptions
try语句的工作原理如下。
另一个资源探索这个问题。
https://dbaktiar-on-python.blogspot.com/2009/07/python-lazy-evaluation-on-exception.html
我的解决方案向前发展:
tl;dr -如果try子句执行时没有异常,则完全跳过except子句。
rekjcdws2#
可以在运行时定义异常。例如:
myexcept.py contains:
您的程序略有修改:
其行为与您的程序类似:
NameError: name 'ValueErro' is not defined
.但是更改:
import_myexcept = True
,并且在遇到except ValueErro:
语句时,ValueErro
异常已定义,并且不会发生NameError。