Allg. Frage zum ErrorHandling

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,

um meinen Code etwas schöner und besser verständlich zu machen versuche ich gerade "richtiges" ErrorHandling, also über Exceptions einzubauen. Bisher habe ich einfach immer nur über ein print einen Fehler ausgegeben und dann ein return None verwendet. Nun mache ich es so:
Code: a

Code: Alles auswählen

try:
    blabla
except IOError:
    raise Exception(file, "fehlertag")
Code: b

Code: Alles auswählen

import a
try:
    a.dosomethingwitherror()
except Exception
    supportederrortags = ["fu", "bar", "fasel"]
    file, tag = Exception
    if tag in supportederrortags:
        if tag == "fu":
            mach blabla
        ...
        ...
    else:
        raise
Das ganze Funktioniert zwar aber pytonisch sieht das nicht gerade aus.
Wie mache ich das ganze Richtig?
Also am besten so das ich nach dem try es so abhandeln kann:

Code: Alles auswählen

try:
...
except MissingFile:
bla
except UnsupportedFile:
fasel
usw.

Schonmal Danke für die Hilfe!

p90
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Verstehe Deinen mittigen Ansatz gar nicht! Das untere zeigt es soch ganz gut: Wenn Du unterschiedliche Fehler abfängst und unterschiedlich verarbeiten willst, dann musst Du das eben sequentiell lösen.

Die Frage ist ja immer: Einen Fehler abfangen braucht man ja nur, wenn man da irgend wie weiter arbeiten will oder eine hübschere Fehlermeldung für den Benutzer generieren möchte.

Auf tiefer Ebene eine Exception abfangen und dann eine neue, eigene zu werfen, die man dann irgend wo anders behandelt halte ich für umständlich. Zumindest zeigst Du hier nicht wirklich, was der Vorteil davon sein kann.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

ich fange den Fehler ab da ich 10 Stellen habe an denen ein IOError passieren kann.
Nun weiß der Benutzer aber nicht welche von den 10 es ist und was er korrigieren muss.
Ähnliches gilt für andere Fehler.
Ich bekomme z.B. an einer bestimmten Stelle einen KeyError wenn ich in meinen Daten ein bestimmtes Feld nicht finde.
Nun soll dem Benutzer in diesem Fall dies mitgeteilt werden. Sollte aber an einer anderen Stelle ein KeyError passieren da ich mist gebaut haben sollte, möchte ich natürlich diesen als normalen KeyError weiter geben.
Ich kann also nicht einfach in meinem Modul a das alles weglassen und dann von außen einfach ein Except KeyError machen.

Zu dem mittleren Ansatz:
Was ich im Prinzip mache ist:
Ich Benutze das zweite Argument von Exception um zu Kennzeichnen um was für einen Fehler es sich handelt.
In b muss ich natürlich nachsehen ob ich diesen Fehler kenne (es können ja auch andere Exceptions auftreten die nicht ich eingebaut habe) und handle dementsprechend. Handelt es sich um einen von meinen Fehlern handle ich entsprechend, alle anderen werden durch gereicht.
BlackJack

@p90: Beim "mittleren Ansatz" kapselst Du also einen Fehlercode, also diese scheusslichen Dinger die man mit Ausnahmen eigentlich beseitigen wollte, in einer Ausnahme. ;-)

Wenn Du wissen willst, um was für einen Fehler es sich handelt, dann sollte das die Ausnahme selbst deutlich machen und nicht ein Attribut davon. Also nicht ``raise MyException(filename, 'missing file')`` sondern ``raise MissingFile(filename)``. Dann kannst Du auch ``except MissingFile:`` verwenden.
p90
User
Beiträge: 198
Registriert: Donnerstag 22. Juli 2010, 17:30

Hi,

@Blackjack
Das war mir schon klar, deshalb schreib ich euch ja. Immo ist das vom Regen in die Traufe ^^

Wie definiere ich den diese Fehler?
(ich denke mal ich muss das irgendwie machen, ein einfaches

Code: Alles auswählen

raise MissingFile
sorgt anscheinend für ein "NameError" statt einem MissingFile)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Also wenn du das nicht weißt, solltest du dir vielleicht ein Python-Totorial ansehen:

Code: Alles auswählen

class MissingFile(IOError):
    pass
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten