为什么Python 2.7不允许我在收益后隐式重新引发异常?

时间:2014-08-07 18:26:26

标签: python python-2.7 generator

当我在except:块内部屈服时,我注意到Python 2.7.5中有一些奇怪的行为:

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

1 个答案:

答案 0 :(得分:6)

这只是Python 2.x中的一个错误。根据{{​​3}},问题在Python 3中得到修复,但由于向后移植的复杂性,修复程序在进入维护模式之前从未达到2.7:

  

这已在Python 3中修复。我不知道它是否值得向后移植   变化,因为它可能很难避免也向后移植   异常模型中的不兼容性。

八个月后......

  

由于2.7正在进行维护,因此不会后退。