Seite 1 von 1
Allg. Frage zum ErrorHandling
Verfasst: Dienstag 15. Februar 2011, 15:03
von p90
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
Re: Allg. Frage zum ErrorHandling
Verfasst: Dienstag 15. Februar 2011, 15:14
von Hyperion
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.
Re: Allg. Frage zum ErrorHandling
Verfasst: Dienstag 15. Februar 2011, 16:41
von p90
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.
Re: Allg. Frage zum ErrorHandling
Verfasst: Dienstag 15. Februar 2011, 17:53
von 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.
Re: Allg. Frage zum ErrorHandling
Verfasst: Dienstag 15. Februar 2011, 19:53
von p90
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
sorgt anscheinend für ein "NameError" statt einem MissingFile)
Re: Allg. Frage zum ErrorHandling
Verfasst: Dienstag 15. Februar 2011, 20:15
von Leonidas
Also wenn du das nicht weißt, solltest du dir vielleicht ein Python-Totorial ansehen: