【发布时间】:2014-10-01 02:38:07
【问题描述】:
我注意到 Python 2.7.5 在 except: 块内屈服时出现了一些奇怪的行为:
def generator():
try:
raise Exception()
except:
yield
raise
list(generator())
此代码因TypeError: exceptions must be old-style classes or derived from BaseException, not NoneType 而失败
为什么 Python 会这样做,而不是像 yield 不在 raise 之前那样重新引发异常?
(显然 Python 3 已经修复了这个问题,并且该函数会按照您的预期生成一个 [None] 列表。)
(解决方法是将异常存储在变量中:except Exception as e: yield; raise e)
【问题讨论】:
-
任意代码(包括也会引发异常的代码)可以在
yield和raise语句之间执行。我怀疑保留一堆可能引发的未决异常的语义几乎是不可能定义的。 -
@chepner 根本没有,异常可能只是成为
except块内的隐藏局部变量。如果它在 Python 3 中工作,那么它听起来就像是一个已修复的错误。 -
异常存储在当前线程的堆栈帧中,但我怀疑它已被清除,因为
yield导致堆栈帧被搁置并且控制返回到驱动迭代的帧.
标签: python python-2.7 generator