
[英]NameError: name 'variable' is not defined, how to handle and exception in the finally block of try/except statement
[英]Uncaught NameError in try except block
以下代码块已通过(cpython)Python 3.6.4和Python 2.7.14进行了测试。
注释掉显式的raise ValueError
语句后,以下代码运行并显示“ Hello!”。 然后是“世界!” 即使不存在ValueErro
符号。
取消注释raise ValueError
语句,并raise ValueError
并引发预期的NameError: name 'ValueErro' is not defined
。
try:
print("Hello!")
# raise ValueError("?")
except ValueErro:
print("Error!")
finally:
print("World!")
我期望NameError在例外块的运行时处理之前能很好地显示出来。
除了语法之外,是否还有其他语法可以在解析步骤中更主动地检查名称/符号?
这是实现错误吗?
谢谢阅读!
在@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子句。
可以在运行时定义异常。 例:
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。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.