生成器中无法捕获的异常

时间:2014-01-08 19:49:44

标签: python exception generator yield

我遇到了Python 2.7的问题,因此从生成器引发的异常无法捕获。

我已经失去了相当多的时间,两次,这种行为。

def gen_function():
    raise Exception("Here.")

    for i in xrange(10):
        yield i

try:
    gen_function()
except Exception as e:
    print("Ex: %s" % (e,))
else:
    print("No exception.")

输出:

No exception.

2 个答案:

答案 0 :(得分:4)

gen_function()会为您生成对象

您需要调用next()函数来调用代码。

您可以使用next功能

直接执行此操作
g = gen_function()
next(g)

for i in g:
    pass # or whatever you want

两者都会触发异常

答案 1 :(得分:2)

调用生成器只会为您提供生成器对象。尚未实际执行生成器中的代码。通常情况并不明显,因为您经常立即应用发电机:

for x in gen_function():
    print x

在这种情况下引发异常。但是哪里?为了使它在发生这种情况时更加明确,我已经明确了for ... in循环(这实际上就是它在幕后的作用):

generator_obj = gen_function()  # no exception
it = iter(generator_obj)  # no exception (note iter(generator_obj) is generator_obj)
while True:
    try:
        x = it.next()  # exception raised here
    except StopIteration:
        break

    print x