2010-01-05 25 views
17

Ich habe ein Programm, von dem ein Teil eine Schleife ausführt. Während der Ausführung dieser Schleife gibt es Ausnahmen. Offensichtlich möchte ich, dass mein Programm ohne Fehler läuft, aber aus Gründen des Fortschritts möchte ich, dass das Programm über die gesamte Eingabe ausgeführt wird und nicht stoppt, wenn eine Ausnahme ausgelöst wird. Der einfachste Weg dazu wäre die Implementierung eines except Blocks.Handle Arbitrary Exception, Drucken Default Exception Nachricht

Allerdings, wenn ich dies tun, es except s alle Ausnahmen und fährt mit dem Programm fort und ich bekomme nie die Ausnahmebedingungsnachricht zu sehen, die ich brauche, um zu debuggen.

Gibt es einen Weg zu except eine beliebige Ausnahme und in der Lage, die Ausnahme Nachricht im except Block auszudrucken?

Antwort

17
try: 
    #stuff 
except Exception as e: 
    print e 

traceback Das Modul bietet verschiedene Funktionen, um weitere Informationen aus dem Ausnahmeobjekt (e, oben) zu extrahieren.

Quelle Errors and Exceptions

+3

Beachten Sie, dass die Syntax "Exception, e" ab 2.6 veraltet ist und nicht mehr ab 3.0 arbeitet. Wenn Sie Code haben, der sowohl mit 2.x als auch mit 3.x arbeiten soll, verwenden Sie stattdessen "Exception as e". (Wenn Sie jedoch mit 2.5 oder früher arbeiten müssen, müssen Sie diese Syntax verwenden.) – abarnert

4
while True: 
    try: 
     # Do your stuff 
    except Exception, e: 
     print "Something happened: %s" % e 
+1

In Python 3 verwenden Sie stattdessen 'print (" Etwas ist passiert: {} ". Format (e))'. – amicitas

12

Betrachten Sie das Protokollierungsmodul mit Python, das ist Sie geben viel von der Funktionalität für die spätere Inspektion Probleme zu protokollieren. Im Folgenden finden Sie ein einfaches Beispiel des Protokollierungsmodul mit Ausnahmen protokollieren:

import logging 
LOG_FILE = '/tmp/exceptions.log' 
logging.basicConfig(filename=LOG_FILE,level=logging.ERROR) 

while True: 
try: 
    # Code that may throw exceptions 
except Exception, e: 
    logging.exception("An exception happened") 

die logging.exception Funktion innerhalb eines Exception-Handler Durch die Verwendung von wie hier die Ausnahme info erfolgt automatisch in der Logging-Nachricht hinzugefügt.

4

Ich finde das für das Debuggen viel nützlicher sein:

from traceback import print_exc 
try: 
    raise Exception("doh!") 
except: 
    print_exc() 
6

Während Antwort James fast immer ist das, was Sie eigentlich wollen, ist es nicht ganz, was der OP fragte nach:

Gibt es eine Möglichkeit, jede beliebige Ausnahme auszuschließen und die Exception-Nachricht im Except-Block auszudrucken?

Exception eigentlich nicht alle Ausnahmen behandeln, nur alle Ausnahmen Sie in der Regel fangen wollen. Insbesondere in 2.5 und später:

Alle eingebauten, nicht systemauslösenden Ausnahmen werden von dieser Klasse abgeleitet. Alle benutzerdefinierten Ausnahmen sollten auch von dieser Klasse abgeleitet sein.

Dies läßt ein paar Dinge aus:

  • eingebaute System Austritt Ausnahmen, wie ein KeyboardInterrupt vom Benutzer ^C (2.5 und höher)
  • benutzerdefinierte Ausnahmen, der don schlagen ‚t folgen, dass‚sollte‘

in sehr seltenen Fällen, Sie Dinge wie KeyboardInterrupt behandeln möchten, in welchem ​​Fall Sie BaseException stattverwenden.(Siehe Exception hierarchy für eine Liste von denen Ausnahmen sind und nicht Exception Subklassen.) Also:

try: 
    # stuff 
except BaseException as e: 
    print e 

und (in der Regel vorübergehend während des Debuggens) Manchmal findet man wirklich absolut alles zu handhaben wollen. In 2.7 enthält das Ausnahmen, die als Old-Style-Klassen definiert sind. in 2.5 und früher enthält es auch Zeichenfolgen. Der einzige Weg, alle diese Möglichkeiten zu handhaben ist mit einem nackten except zu verwenden und dann verwenden sys.exc_info (und gegebenenfalls re- raise, was Sie wollen nicht zu handhaben):

try: 
    # stuff 
except: 
    type, value, traceback = sys.exc_info() 
    print value 

Als Randbemerkung, ich verwende die neue except Syntax (except Exception as e) oben. Dies funktioniert in 2.6 und später, einschließlich 3.x. Die alte Syntax (except Exception, e) ist in 2.6 veraltet und funktioniert in 3.0 nicht mehr. Wenn Sie jedoch mit älteren 2.x-Versionen arbeiten möchten, müssen Sie sie verwenden.