如果您的内部迭代可以在异常之后继续,那么您需要将其包装成一个简单的生成器:
def wrapper(gen):
while True:
try:
yield next(gen)
except StopIteration:
raise
except Exception as e:
print(e) # or whatever kind of logging you want
pass
例如:
In [9]: list(wrapper(csv.reader(open('test.csv', 'r'))))
field larger than field limit (10)
Out[9]: [['foo', 'bar', 'baz'], ['abc', 'def', 'ghi']]
另一方面,如果内部迭代器在异常之后无法继续,则无法包装它:
def raisinggenfunc():
yield 1
raise ValueError("spurious error")
yield 3
In [11]: list(wrapper(raisinggenfunc()))
spurious error
Out[11]: [1]
通过调用Python生成器函数或评估生成器表达式创建的任何生成器将不会被恢复.
在这种情况下,您需要找到一些方法来创建一个恢复迭代的新迭代器.对于像csv.reader这样的东西,这意味着在将文件包装在csv.reader之前从文件中读取n行.在其他情况下,可能意味着将n传递给构造函数.在其他情况下 – 就像上面提到的那样,只是不可能.