Ich bin verwirrt durch die Interaktion zwischen Python-2-Iteratoren und Ausnahmen.Wie wiederhole ich nach einer Ausnahme?
Insbesondere den folgenden Code angegeben:
def gen_int():
if not hasattr(gen_int,"x"):
gen_int.x = 0
while True:
gen_int.x += 1
yield gen_int.x
def gen_odd():
for x in gen_int():
if x % 2:
yield x
else:
raise ValueError("gen_odd",x)
(! Nehmen Sie bitte die oben genannten sind aus meiner Kontrolle), schreibe ich
def gen_all():
it = gen_odd()
while True:
try:
yield it.next()
except ValueError as exn:
print exn
func_name, x = exn
assert func_name == "gen_odd"
yield x
in der Hoffnung, den vollen Strom zurückzugewinnen generiert von gen_int
.
jedoch die Iteration nach der ersten Ausnahme stoppt:
def gen_test(top):
for x in gen_all():
print x
if x > top:
break
Hier gibt es 3 Anrufungen:
>>> gen_test(20)
1
('gen_odd', 2)
2
>>> gen_test(20)
3
('gen_odd', 4)
4
>>> gen_test(20)
5
('gen_odd', 6)
6
Die Frage ist: Wie modifiziere ich gen_all
so dass gen_test
druckt alle ints unter top
?
PS. anscheinend funktioniert die Ausnahme in gen_odd
als return
- es kennzeichnet den Iterator als erschöpft. ist das wirklich der Fall? Gibt es einen Workaround?
können Sie Pass oder in Ihrem try/except – tinySandy
@tinySandy weiter: könnten Sie bitte das konkretisieren? – sds
Mögliches Duplikat von [python catch exception und continue try block] (http://stackoverflow.com/questions/19522990/python-catch-exception-and-continue-try-block) – tinySandy