Generator Fehler Handling

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,
muss euch mal wieder belästigen.
Folgendes Problem:
Ich habe einen Generator. Dieser liest Daten und je nach dem was man dem Füttern wirft er auch Fehler.
Diese Fehler will ich nun in meinem Programm sehen und dementsprechend was ins log etc. schreiben.
Nur wie handhabt man das richtig?
Machen wir ein MWE:

Code: Alles auswählen

class gen:
    def __init__(self):
        self.a = 0
    def __iter__(self):
        return self
    def next(self):
        self.a = self.a + 1
        if a == 20: raise IOError
        return self.a
Wie fange ich nun IOError um dann bei Element 21 weiter zu machen?
Habe jetzt mit einer for oder while Schleife und dem with statement rumgespielt aber so richtig begreife ich das noch nicht.
Nehmen wir z.B. die For schleife:

Code: Alles auswählen

a = gen()
try:
    for i in a:
         print i
except:
    continue -> geht nicht weil das continue nicht in der Schleeife ist
    a.next() -> geht aber bin mir nicht sicher warum?
Deshalb, bevor ich wieder stundenlang nur Mist baue, wie macht man das richtig?

Bis später


p90
deets

Zuerstmal hast du keinen Generator, sondern einen Iterator.

Und zweitens funktioniert das so nicht. Ein Iterator, der etwas anderes als eine StopIteration-Exception wirft kann in einem for-statement nicht verwandt werden. Denn damit wird automatisch der scope des for verlassen - und du muesstest wieder aufsetzen.

Du hast prinzipiell zwei Moeglichkeiten:

- du benutzt den Iterator explizit. Dann kannst du deine Exceptions abfangen:

Code: Alles auswählen

it = gen()

try:
    while True:
       try:
          value = it.next()
       except IOError:
           ... # behandeln
except StopIteration:
    pass
Nicht besonders toll..

Die zweite Alternative: du benutzt einen Sentinel-Value, bzw gibst ein komplexeres Ergebnis zurueck:

Code: Alles auswählen


def gen(): # das hier ist uebrigens wirklich kein generator
      yield None, 1
      yield IOError(3), None
      yield None, 2

for error, value in gen():
     if error is not None:
        ... # behandeln
     else:
       ... # was mit value machen
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Erstmal Danke für die schnelle Antwort (und für den Hinweis das ich Generatoren noch nicht verstanden habe, du hast natürlich Recht)
Hm, beide Lösungen sind nicht sehr schön.
Vlt sollte ich es dann anders machen und statt Exceptions dem Programm sagen, dass eine Datei kaputt ist, zu werfen lieber logging einsetzen und im Iterator einfach weiter machen.
Hm, mal sehen, und nochmals Danke!
Antworten