generators and exceptions
Arne Koewing
ark at gmx.net
Sun Mar 16 03:17:02 EST 2003
"Clark C. Evans" <cce at clarkevans.com> writes:
> Anyway, this _only_ prints out 4, instead of 4, 2
> as I expected. I expect 4, 2 beacuse an equivalent
> iterator would produce 4, 2. It seems that generators
> die on the first exception... is there a way around
> this? I'm asking beacuse I'm using generators in a
> non-blocking database system, where I want to raise
> WouldBlock in my generator, but still be able to
> call the generator at a later time when it may
> not block...
you may build your own object handling the iterator protocol,
that wraps up your generator:
from __future__ import generators
class MyExc(Exception): pass
def mygen(val):
while val >= 0:
if val % 2:
yield MyExc() #yield it don't raise
else:
yield val
val = val - 1
class handler:
def __init__(self,itr):
self.iterator=itr
def __getitem__(self,index):
val=self.iterator.next()
if isinstance(val,Exception):
raise val
return val
iterator = iter(handler(mygen(4)))
while 1:
try:
val = iterator.next()
print val
except MyExc: print 'catched'
except StopIteration: break
More information about the Python-list
mailing list