2012-08-31 8 views
7

Angenommen, ich habe ein Python-Programm, wo Assert verwendet wurde, um zu definieren, wie die Dinge sein sollten, und ich möchte Anomalien mit der Read-Eval-Schleife erfassen, anstatt AssertionError geworfen werden.Kann ich das Debuggen von Python auf AssertionError erzwingen?

Zugegeben, ich

if (reality!=expectation): 
    print("assertion failed"); 
    import pdb; pdb.set_trace(); 

haben könnte, aber das ist weit mehr hässlich im Code als ein einfaches assert(reality==expectation).

Ich könnte pdb.set_trace() in einem except: Block auf Top-Level aufgerufen haben, aber dann hätte ich den ganzen Kontext des Scheiterns verloren, oder? (Ich meine, Stacktrace konnte aus dem Ausnahmeobjekt wiederhergestellt werden, aber keine Argumentwerte usw.)

Gibt es etwas wie eine --magic Befehlszeilenflagge, die den Python3-Interpreter in das verwandeln könnte, was ich brauche?

+0

Verwenden Sie Eclipse und führen Sie es im Debug-Modus mit einem Haltepunkt? –

+0

@JoranBeasley: Sie haben nicht immer eine IDE zur Hand. Beispiel: Wenn Sie bei einer SSH-Shell angemeldet sind. – Constantinius

+1

dann pdb von der Kommandozeile verwenden und Haltepunkte verwenden ... http://www.doughellmann.com/PyMOTW/pdb/ 'python -m pdb somescript.py' ist deine' --magic' –

Antwort

4

Werfen Sie einen Blick auf das Projekt nose. Sie können es mit dem --pdb option verwenden, um bei Fehlern auf den Debugger zuzugreifen.

+0

Ich denke, das ist praktisch für diejenigen, die Komponententests durchführen, aber das ist nicht, was ich hier mache. – PypeBros

11

Hauptsächlich aus this great snippet genommen:

import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or type != AssertionError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

Wenn Sie Ihren Code mit dieser initialisieren, alle AssertionError s pdb aufrufen sollte.

+0

werde versuchen, dass ... – PypeBros

+0

Ich nehme an, "Post-Mortem-Modus" ist hier obligatorisch, und es gibt keine Chance 'pdb.set_trace()' wäre nützlich, oder? – PypeBros

+0

Ich bin mir eigentlich nicht sicher, ich denke du musst es versuchen. – Constantinius

Verwandte Themen