可以肯定的是,这在纯 Python 中是不可能的,不幸的是。
观察以下代码:
def testIter(n):
count = 0
while count<n:
try:
for i in xrange(count,n):
if i == 3:
raise Exception("Asdfas")
count = count + 1
yield i
except:
continue
这将输出以下内容:
x = testIter(10)
x.next() # 0
x.next() # 1
x.next() # 2
x.next() # Exception: Asdfas
x.next() # Exception: StopIteration
人们会期望它在 while 循环的新迭代中继续,但事实并非如此。
有些人表示 csv.reader() 继续出错。我不想为它做一个测试用例,但如果是这样,我怀疑这是因为它被实现为一个 C 模块在这里找到。我的 C 不是太尖锐,所以我没有深入研究它,但足以说我认为这是不可能的。
编辑:我没有直接回答你的问题。在可以恢复的迭代器的情况下执行 abarnet 所说的(这意味着它是 C 迭代器)。
编辑2:实际上并不完全正确。
class myInformativeException(Exception):
def __init__(self, count):
self.count = count
def testIter(n):
for i in xrange(n):
if i==4:
raise myInformativeException(i)
yield i
def iterwrap(n):
x = testIter(n)
try:
for i in x:
yield i
except myInformativeException as e:
print "Error on ", e.count
这打印:
0
1
2
3
Error on 4
因此,如果您能够在 X 元素之后创建一个迭代器,那么显然是有可能的。如果您需要更完整的示例,请告诉我。