2012-05-15 10 views
7

Warum ist es eine schlechte Idee, alle Ausnahmen in Python zu fangen?Schlechte Idee, alle Ausnahmen in Python zu fangen

Ich verstehe, dass alle Ausnahmen fangen die except:-Klausel wird auch die ‚besondere‘ Python Ausnahmen abfangen: SystemExit, KeyboardInterrupt und GeneratorExit. Warum also nicht einfach eine except Exception:-Klausel verwenden, um alle Ausnahmen zu erfassen?

+6

Muss ich fangen ‚em all – jamylak

+0

Ich denke, es ist besser, alles in einem Produktionscode zu fangen, aber da die Software entwickelt wird, könnte es Ihr Code schwer für die Fehlersuche machen .... –

+4

@jamylak: http: //stephenvick.wordpress.com/2010/08/02/pokemon-exception-handling/ –

Antwort

20

Weil es furchtbar unspezifisch ist und es Ihnen nicht ermöglicht, etwas Interessantes mit Ausnahme zu machen. Außerdem, wenn Sie jede Ausnahme abfangen, könnte es viele Ausnahmen geben, die passieren, von denen Sie nicht einmal wissen, dass sie passieren (was dazu führen könnte, dass Ihre Anwendung fehlschlägt, ohne dass Sie wirklich wissen, warum). Sie sollten in der Lage sein (entweder durch das Lesen von Dokumentationen oder Experimenten) genau vorauszusagen, welche Ausnahmen Sie behandeln müssen und wie Sie damit umgehen sollen, aber wenn Sie blind alle von Anfang an unterdrücken, werden Sie es nie erfahren.

Also, auf vielfachen Wunsch, hier ist ein Beispiel. Ein Programmierer schreibt Python-Code und sie bekommt eine IOError. Statt weiter zu untersuchen, beschließt sie, alle Ausnahmen zu fangen:

def foo(): 
    try: 
     f = open("file.txt") 
     lines = f.readlines() 
     return lines[0] 
    except: 
     return None 

Sie das Problem nicht in seiner Art nicht klar: was ist, wenn die Datei vorhanden ist und zugänglich ist, aber es ist leer? Dann wird dieser Code eine IndexError auslösen (da die Liste lines leer ist). Also wird sie Stunden damit verbringen, sich zu fragen, warum sie None von dieser Funktion zurückbekommt, wenn die Datei existiert und nicht gesperrt wird, ohne etwas zu bemerken, das offensichtlich wäre, wenn sie Fehler genauer abgefangen hätte, was bedeutet, dass sie auf Daten zugreift, die das nicht tun existieren.

+0

@Raffe: Können Sie bitte konkrete Beispiele geben? – Bandicoot

+0

@Bandicoot spezifische Beispiele, warum das Abfangen aller Ausnahmen eine schlechte Idee ist? –

+0

@Raffe: Yup. Wird mir helfen, deine Antwort besser zu verstehen. Vielen Dank ! – Bandicoot

3

Weil Sie wahrscheinlich jede Ausnahme anders behandeln möchten. Es ist nicht dasselbe, ein KeyInterrupt zu haben, als ein Encoding-Problem zu haben, oder ein OS-One ... Sie können bestimmte Ausnahmen nacheinander abfangen.

try: 
    XXX 
except TYPE: 
    YYY 
except TYPE: 
    ZZZ 
Verwandte Themen