残念ながら、これが純粋な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 要素の後にイテレータを作成できれば、明らかに可能です。より完全な例が必要な場合はお知らせください。