2010-12-01 8 views
14

Ich habe einige Code, der eine Ausnahme behandelt, und ich möchte etwas nur dann tun, wenn es eine bestimmte Ausnahme ist, und nur im Debug-Modus. So zum Beispiel:Handle spezifische Ausnahmetyp in Python

try: 
    stuff() 
except Exception as e: 
    if _debug and e is KeyboardInterrupt: 
     sys.exit() 
    logging.exception("Normal handling") 

Als solche will ich nicht nur hinzufügen:

except KeyboardInterrupt: 
    sys.exit() 

weil ich den Unterschied in diesem Debug-Code minimal

+1

was eigentlich fragen Sie? – Marii

Antwort

18

Nun, wirklich, Sie sollten wahrscheinlich den Handler für KeyboardInterrupt getrennt halten. Warum sollten Sie nur Tastatur-Interrupts im Debug-Modus behandeln, aber sonst verschlucken?

Das heißt, Sie isinstance verwenden können den Typ eines Objekts zu überprüfen:

try: 
    stuff() 
except Exception as e: 
    if _debug and isinstance(e, KeyboardInterrupt): 
     sys.exit() 
    logger.exception("Normal handling") 
+0

Dies ist auf einem eingebetteten System, das ohne eine Shell ausgeführt wird. Wir konnten also nur einen Tastatur-Interrupt im Debug-Modus bekommen. Wir kümmern uns also nur um alle Ausnahmen. – Falmarri

+0

isinstanz. das ist, was ich suche. thx – Falmarri

19

zu halten bin versucht, diese ist so, wie es gemacht wird.

Es gibt minimale Wiederholungen. Nicht Null, aber minimal.

Wenn die "normale Handhabung" mehr als eine Codezeile ist, können Sie eine Funktion definieren, um eine Wiederholung der beiden Codezeilen zu vermeiden.

+0

Sie schlagen mich um 30 Sekunden, ich denke, – Velociraptors

+0

Es ist "außer Ausnahme, e:" – marcog

+5

@marcog: "außer Ausnahme als e" ist in Python 2.6 + gültig. – mipadi

0

Was ist los mit

try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     logging.exception("Debug handling") 
     sys.exit() 
    else: 
     logging.exception("Normal handling") 
0

entweder die Standard-Methode in den anderen Antworten erwähnt verwenden, oder wenn Sie wirklich innerhalb der außer Block testen möchten, dann können Sie isinstance() verwenden.

try: 
    stuff() 
except Exception as e: 
    if _debug and isinstance(e, KeyboardInterrupt): 
     sys.exit() 
    logging.exception("Normal handling") 
1

Sie sollten KeyboardInterrupt Blase den ganzen Weg nach oben und Trap sie auf höchstem Niveau lassen.

if __name__ == '__main__': 
    try: 
     main() 
    except KeyboardInterrupt: 
     sys.exit() 
    except: 
     pass 

def main(): 
    try: 
     stuff() 
    except Exception as e: 
     logging.exception("Normal handling") 
     if _debug: 
      raise e 
0
try: 
    stuff() 
except KeyboardInterrupt: 
    if _debug: 
     sys.exit() 
    logging.exception("Normal handling") 
except ValueError: 
    if _debug: 
     sys.exit() 
    logging.exception("Value error Normal handling") 
else: 
    logging.info("One more message without exception") 
+1

-1: 'else' sollte 'except' sein, 'else' Klausel ist für Code ausgeführt werden, wenn es keine Ausnahme gibt. –

+0

Ja, 'else' Zweig wird ausgeführt, wenn keine Ausnahme vorliegt. Es ist nur zum Beispiel. Aber Sie haben Recht, ich sollte Code-Beispiel bearbeiten, um 'echten' Programmstatus anzuzeigen. – Lex

0

können Sie spezifische Ausnahmen in Python nennen:

try: 
    stuff() 
except KeyboardInterrupt: 
    sys.exit() 
except Exception: 
    normal_handling()