414 Stimmen

Warum ist "außer: pass" eine schlechte Programmierpraxis?

Ich sehe oft Kommentare zu anderen Stack Overflow Fragen, die darauf hinweisen, dass die Verwendung von except: pass nicht empfohlen wird. Warum ist das schlecht? Manchmal ist es mir einfach egal, welche Fehler auftreten und ich möchte einfach nur den Code weiter ausführen.

try:
    something
except:
    pass

Warum ist es schlecht, einen except: pass Block zu verwenden? Was macht es schlecht? Liegt es daran, dass ich einen Fehler einfach ignoriere oder dass ich jeglichen Fehler abfange?

16voto

Alexander Zhukov Punkte 4109

Zunächst verletzt es zwei Prinzipien des Zen von Python:

  • Explizit ist besser als implizit
  • Fehler sollten niemals stillschweigend passieren

Was es bedeutet, ist dass du absichtlich deinen Fehler stillschweigend passieren lässt. Darüber hinaus weißt du nicht einmal, welcher Fehler genau aufgetreten ist, weil except: pass jede Ausnahme abfängt.

Zweitens, wenn wir versuchen, abstrahieren vom Zen von Python und einfach nur von Vernunft sprechen, solltest du wissen, dass die Verwendung von except: pass dich mit keinem Wissen und keiner Kontrolle in deinem System zurücklässt. Die Faustregel lautet, eine Ausnahme zu erheben, wenn ein Fehler auftritt, und angemessene Maßnahmen zu ergreifen. Wenn du im Voraus nicht weiß, welche Maßnahmen das sein sollten, protokolliere zumindest den Fehler irgendwo (und besser wirf die Ausnahme erneut):

try:
    something
except:
    logger.exception('Etwas ist passiert')

Aber normalerweise, wenn du versuchst, jede Ausnahme abzufangen, machst du wahrscheinlich etwas falsch!

14voto

Kevin Punkte 2104

Der #1 Grund wurde bereits genannt - es verbirgt Fehler, mit denen Sie nicht gerechnet haben.

(#2) - Es macht Ihren Code für andere schwer zu lesen und zu verstehen. Wenn Sie eine FileNotFoundException abfangen, wenn Sie versuchen, eine Datei zu lesen, ist es für einen anderen Entwickler ziemlich offensichtlich, welche Funktionalität der 'catch'-Block haben sollte. Wenn Sie keine Ausnahme angeben, benötigen Sie zusätzliche Kommentare, um zu erklären, was der Block tun soll.

(#3) - Es zeigt eine faule Programmierung. Wenn Sie das generische try/catch verwenden, deutet dies entweder darauf hin, dass Sie die möglichen Laufzeitfehler in Ihrem Programm nicht verstehen, oder dass Sie nicht wissen, welche Ausnahmen in Python möglich sind. Das Abfangen eines spezifischen Fehlers zeigt, dass Sie sowohl Ihr Programm als auch die Palette der Fehler verstehen, die Python wirft. Dies wird andere Entwickler und Code-Reviewer eher dazu bringen, Ihrer Arbeit zu vertrauen.

13voto

Ian Harvey Punkte 219

Also, welche Ausgabe erzeugt dieser Code?

fruits = [ 'apple', 'pear', 'carrot', 'banana' ]

found = False
try:
     for i in range(len(fruit)):
         if fruits[i] == 'apple':
             found = true
except:
     pass

if found:
    print "Found an apple"
else:
    print "No apples in list"

Stellen Sie sich nun vor, der try-except-Block besteht aus Hunderten von Zeilen, die komplexe Objekthierarchien aufrufen, und wird selbst mitten im Aufrufbaum eines großen Programms aufgerufen. Wenn das Programm schief geht, wo fangen Sie an zu suchen?

12voto

The Spooniest Punkte 2753

Das except:pass-Konstrukt unterdrückt im Wesentlichen alle außergewöhnlichen Bedingungen, die während der Ausführung des im try:-Block abgedeckten Codes auftreten.

Was diese Praxis schlecht macht, ist, dass es normalerweise nicht das ist, was du wirklich möchtest. Oft tritt eine spezifische Bedingung auf, die du unterdrücken möchtest, und except:pass ist ein zu grobes Werkzeug. Es erledigt die Aufgabe, verbirgt aber auch andere Fehlerbedingungen, die du wahrscheinlich nicht vorhergesehen hast, aber durchaus auf andere Weise behandeln möchtest.

Was dies insbesondere in Python wichtig macht, ist, dass nach den Gepflogenheiten dieser Sprache Ausnahmen nicht unbedingt Fehler sind. Sie werden natürlich oft auf diese Weise verwendet, wie in den meisten Sprachen. Aber Python hat sie gelegentlich verwendet, um einen alternativen Ausgangspfad aus einigen Codeaufgaben zu implementieren, der nicht wirklich Teil des normalen Ablaufs ist, aber bekannt ist, von Zeit zu Zeit vorzukommen und in den meisten Fällen sogar erwartet wird. SystemExit wurde bereits als altes Beispiel genannt, aber das heutzutage am häufigsten verwendete Beispiel könnte StopIteration sein. Die Verwendung von Ausnahmen auf diese Weise führte zu viel Kontroverse, insbesondere als Iteratoren und Generatoren erstmals in Python eingeführt wurden, aber schließlich setzte sich die Idee durch.

11voto

Im Allgemeinen können Sie jeden Fehler/Ausnahme in einer der drei Kategorien klassifizieren:

  • Tödlich: Nicht Ihre Schuld, Sie können sie nicht verhindern, sich nicht davon erholen. Sie sollten sie auf keinen Fall ignorieren und fortsetzen, und Ihr Programm in einem unbekannten Zustand lassen. Lassen Sie den Fehler einfach Ihr Programm beenden, es gibt nichts, was Sie tun können.

  • Dummköpfig: Ihr eigener Fehler, höchstwahrscheinlich aufgrund eines Übersehens, Bugs oder Programmierfehlers. Sie sollten den Bug beheben. Auch hier sollten Sie ihn auf keinen Fall ignorieren und weitermachen.

  • Exogen: Sie können diese Fehler in außergewöhnlichen Situationen erwarten, wie Datei nicht gefunden oder Verbindung abgebrochen. Sie sollten diese Fehler explizit behandeln, und nur diese.

In allen Fällen wird except: pass nur Ihr Programm in einem unbekannten Zustand lassen, in dem es mehr Schaden anrichten kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X