Dies ist eine Fortsetzung von Behandlung einer in einem Generator geworfenen Ausnahme und behandelt ein allgemeineres Problem.
Ich habe eine Funktion, die Daten in verschiedenen Formaten liest. Alle Formate sind zeilen- oder satzorientiert und für jedes Format gibt es eine dedizierte Parsing-Funktion, die als Generator implementiert ist. Die Hauptlesefunktion erhält also eine Eingabe und einen Generator, der sein jeweiliges Format aus der Eingabe liest und Datensätze an die Hauptfunktion zurückliefert:
def read(stream, parsefunc):
for record in parsefunc(stream):
mache_etwas(record)
wobei parsefunc
so etwas ist wie:
def parsefunc(stream):
while not eof(stream):
rec = read_record(stream)
mach etwas
yield rec
Das Problem, dem ich gegenüberstehe, ist, dass obwohl parsefunc
eine Ausnahme werfen kann (z.B. beim Lesen aus einem Stream), es keine Ahnung hat, wie damit umzugehen ist. Die Funktion, die für die Behandlung von Ausnahmen verantwortlich ist, ist die Hauptfunktion read
. Beachten Sie, dass Ausnahmen auf zeilenweiser Grundlage auftreten, daher sollte der Generator seine Arbeit fortsetzen und Datensätze zurückliefern, auch wenn ein Datensatz fehlschlägt, bis der gesamte Stream erschöpft ist.
In der vorherigen Frage versuchte ich, next(parsefunc)
in einen try
-Block zu setzen, aber wie sich herausstellte, wird dies nicht funktionieren. Also muss ich ein try-except
zur parsefunc
selbst hinzufügen und dann irgendwie Ausnahmen an den Verbraucher weitergeben:
def parsefunc(stream):
while not eof(stream):
try:
rec = read_record()
yield rec
except Exception as e:
?????
Ich bin eher zurückhaltend, dies zu tun, weil
- es keinen Sinn macht,
try
in einer Funktion zu verwenden, die nicht dazu gedacht ist, Ausnahmen zu behandeln - mir unklar ist, wie Ausnahmen an die verbrauchende Funktion übergeben werden sollen
- es viele Formate und viele
parsefunc
's geben wird, möchte ich sie nicht mit zu viel Hilfscode überladen.
Hat jemand Vorschläge für eine bessere Architektur?
Eine Notiz für Googler: Neben der besten Antwort beachten Sie auch senderle's und Jon's Beiträge - sehr kluge und aufschlussreiche Sachen.