繁体   English   中英

尝试除块中未捕获的NameError

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM