我遇到了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.
答案 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