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
Pythonic or not? Ausnutzen von try-except
@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.
Abbruch einer Rekursion wäre IMHO aber beispielsweise im Rahmen einer vernünftigen Verwendung von Ausnahmen.
@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?
@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.
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.
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?
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?