Wie handle ich Exceptions in Python try-except-Blöcken richtig?

wind17 IN 📗 Student 👁 41 ⚑ Melden Programmierung

Ich schreibe jetzt schon ein paar Jahre Python und bin mir immer noch nicht sicher, ob ich spezifische Exceptions abfangen sollte oder einfach eine breite except-Klausel verwenden. Mein aktueller Code hat viele generische Exception-Handler und ich frage mich, ob das eigentlich eine schlechte Praxis ist oder ob es für kleinere Projekte okay ist.

2 Antworten

★ Beste Antwort

Was macht dein Code eigentlich, wenn diese Exceptions auftauchen - loggst du sie, versuchst du es erneut, oder gehst du einfach stillschweigend weiter?

Der Grund, warum Leute auf spezifische Exceptions pochen, ist, dass ein nacktes `except:` oder `except Exception:` buchstäblich alles abfängt, auch Sachen, die du nicht erwartet hast und wahrscheinlich nicht abfangen solltest. Wenn du zum Beispiel versucht, eine Datei zu öffnen, und du fängst `FileNotFoundError` ab, ist das spezifisch und macht Sinn. Aber ein nacktes except fängt auch Sachen wie `KeyboardInterrupt` oder `SystemExit` ab, die du normalerweise durchlassen willst. Noch schlimmer ist, dass es Bugs versteckt - wenn dein Code einen Tippfehler oder einen Logikfehler hat, der etwas Unerwartetes auslöst, wirst du es nie sehen, weil die except-Klausel es aufgefressen hat.

Das gesagt - bei kleineren Scripts oder schnellen Sachen werden Leute pragmatisch. Der Unterschied zeigt sich wirklich, wenn du debuggst oder wenn dein Code an jemand anderen weitergegeben wird. Spezifische Exceptions machen deine Absicht klar - dieser Code weiß, wie er mit einer fehlenden Datei umgehen soll, aber nicht mit einem Datenbankverbindungsproblem. Wenn du was schreibst, das klein bleiben soll, ist `Exception` abfangen (nicht nacktes `except`) viel sicherer als ein pauschaler Handler, und du kannst zumindest sehen, was abgefangen wird. Wenn deine Projekte wachsen, wirst du spezifischer werden wollen. Die Gewohnheit, bewusst zu sein, was du abfängst, ist nicht nur Pedanterie - sie bewahrt dich vor mysteriösen Bugs später.

wind17 asker Ich protokolliere sie derzeit einfach und mache weiter. Hauptsächlich Datei-I/O und API-Aufrufe in kleinen Skripten, daher bin ich noch nicht auf Probleme gestoßen, aber ich verstehe deinen Punkt über versteckte Fehler.

Spezifische Exceptions schlagen generische, weil du Bugs fängst, die du gar nicht verschlucken wolltest - wie einen Tippfehler in einem Variablennamen, der `NameError` wirft, den ein nacktes `except:` versteckt statt dir zu helfen, ihn zu beheben. Selbst bei kleineren Projekten lohnt sich die Gewohnheit schnell; du kannst verwandte Exceptions einfach gruppieren wie `except (ValueError, TypeError):`, wenn du es schlank halten willst.

Die echte Falle, die Leute übersehen: nacktes `except:` fängt auch Dinge wie `KeyboardInterrupt` und `SystemExit`, also könnte dein Programm die Ctrl+C eines Nutzers ignorieren und einfach weiterlaufen. Nutze `except Exception:` als absolutes Minimum, wenn du einen Catch-All brauchst, aber ehrlich gesagt: Nimm dir 30 Sekunden Zeit, um herauszufinden, was wirklich fehlschlagen könnte, und liste das auf.

Deine Antwort

Anmeldenzum Beantworten.