try除了块之外没有看到NameError

时间:2018-01-22 01:17:09

标签: python

使用(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语法可以在解析步骤中更积极地检查名称/符号?

这是一个实施错误吗?

感谢阅读!

2 个答案:

答案 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。