使用(cpython)Python 3.6.4和Python 2.7.14测试了以下代码块。
在明确的raise ValueError
语句被注释掉后,以下代码运行并打印" Hello!"然后"世界!"即使没有ValueErro
符号也存在。
取消注释raise ValueError
语句,引发ValueError并引发预期的NameError: name 'ValueErro' is not defined
。
try:
print("Hello!")
# raise ValueError("?")
except ValueErro:
print("Error!")
finally:
print("World!")
我希望NameError在运行时处理except块之前很好地显示出来。
是否有一种不同的except语法可以在解析步骤中更积极地检查名称/符号?
这是一个实施错误吗?
感谢阅读!
答案 0 :(得分:1)
在@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子句。
答案 1 :(得分:0)
可以在运行时定义异常。例如:
myexcept.py包含:
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。