Pythonic or not? Ausnutzen von try-except

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

try...except ausreizen finde ich

... cool - da geht was
1
9%
... kann man in Grenzfällen machen
6
55%
... WTF - das geht gar nicht!
4
36%
 
Insgesamt abgegebene Stimmen: 11
fonzy
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:21

Hi Ihrs,

ich wollt mal fragen, wie Ihr das seht. Ist es guter Programmierstil, bzw. Pythonic wenn man try...except Blöcke verwendet um eine bestimmte Funktionalität zu realisieren, ja u.U. sogar Funktionalität durch Exception-Werfen antriggert - oder sollte man Exceptions dafür verwenden wofür sie ursprünglich gedacht waren: Fehler melden.

Wegen des eher unkonventionellen Programmverlaufs, kann man mit try...except ziemlich coole sachen Hintricksen. Aber der Leser dieses Codes dürfte u.U. irritiert sein, warum an der Stelle eine Exception geworfen wurde.

Danke für Eure Einschätzung.
C U
Fonzy
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Halte ich für nicht besonders sauber... Am Ende wundert man sich doch nur wieder wie er jetzt das und das gemacht hat ;)
BlackJack

@fonzy: Ausnahmen sind nicht für Fehler gedacht, sondern für Ausnahmen — darum heissen die so. Die Frage ist also ob eine Ausnahme den Regelfall oder einen aussergewöhnlichen Fall darstellt. Wobei aussergewöhnlich auch so etwas wie das Ende einer Iteration sein kann (`StopIteration`). „Coole Sachen hintricksen” ist eher schlecht, denn die Formulierung impliziert, dass es trickreich und damit nicht einfach zu verstehen ist. Man kann sich damit zum Beispiel ``goto`` (und ``comefrom``) basteln, was sicher keine so tolle Idee ist.

Abbruch einer Rekursion wäre IMHO aber beispielsweise im Rahmen einer vernünftigen Verwendung von Ausnahmen.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

Musste auch spontan an goto denken, habe es mir aber verkniffen :D
fonzy
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:21

@BlackJack: Das Ende einer Iteration ist ja dann auf jeden Fall schon etwas, das ich gewollt herbeiführen will. Wäre also kein Fehler. D.h. Du würdest die Verwendung von exceptions zur Programmsteuerung beführworten... Machst Du sowas dann nochmal extra für den Leser kenntlich im Vergleich zum Fehlerfall abfangen?
BlackJack

@fonzy: Ich weiss jetzt nicht ob Dir klar ist, dass in Python bei jeder ``for``-Schleife am Ende eine `StopIteration` involviert ist!? Ausser bei Endlos-Iteratoren natürlich.

Wie gesagt, in Ausnahmefällen kann man Ausnahmen verwenden. Ich wäre vorsichtig was das verwenden für gewöhnliche Steuerung des Programmflusses angeht, also da wo der Leser eigentlich andere Kontrollstrukturen erwarten würde. Es ist wie ``goto`` ein Sprung an den Sprachmitteln zur strukturierten Programmierung vorbei, und damit potentiell schwerer nach zu vollziehen.
fonzy
User
Beiträge: 9
Registriert: Mittwoch 18. Januar 2012, 17:21

Oder um es auch anders auszudrücken:

Nehmen wir an, wir wollen ein file öffnen, das womöglich nicht da ist. Welche Version ist besser:
a)
try:
open("file","rb")
except IOError, e:
print str(e)

oder
b)
if os.path.exists(file):
open("file","rb")

Sollte man also wo es geht vorher den exception auslösenden zustand prüfen, oder die erwartete exception abfangen?
Benutzeravatar
/me
User
Beiträge: 3554
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

fonzy hat geschrieben: if os.path.exists(file):
open("file","rb")
Das geht gar nicht!

Zwischen dem Check und dem Öffnen kann dir jemand problemlos die Datei unter dem Hintern wegziehen.
Antworten