我正在尝试捕捉一个生成器调用者抛出的异常:
class MyException(Exception):
pass
def gen():
for i in range(3):
try:
yield i
except MyException:
print 'handled exception'
for i in gen():
print i
raise MyException
这将输出
$ python x.py
0
Traceback (most recent call last):
File "x.py", line 14, in <module>
raise MyException
__main__.MyException
当我打算输出时
$ python x.py
0
handled exception
1
handled exception
2
handled exception
回顾过去,我认为这是因为调用者与生成器具有不同的堆栈,因此异常没有向上冒泡到生成器。这正确吗?还有其他方法可以捕获调用者引发的异常吗?
另外:我可以使用generator.throw()使其工作,但这需要修改调用者:
def gen():
for i in range(3):
try:
yield i
except MyException:
print 'handled exception'
yield
import sys
g = gen()
for i in g:
try:
print i
raise MyException
except:
g.throw(*sys.exc_info())
yield <变量名>
返回值永远不会引发异常。可以将生成器视为在返回值之间“暂停”。如果执行a = gen(); next(a); raise MyException
,那么异常会如何处理? - Artyer