Was ist der einfachste Weg, um Python pdb zu verwenden, um die Ursache einer unbehandelten Ausnahme zu untersuchen?

Ich habe gerade alle meine Unit-Testdaten von JSON nach YAML umgewandelt, und jetzt wird eine Ausnahme irgendwo in meinem Code angehoben. Genauer gesagt, ist dies gedruckt Traceback:

  Traceback (letzter Anruf zuletzt):
   Datei "tests / test_addrtools.py", Zeile 95, in test_validate_correctable_addresses
     Self.assertTrue (self.validator (addr), msg)
   Datei "/Users/tomas/Dropbox/Broadnet/broadpy/lib/broadpy/addrtools.py", Zeile 608, in __call__
     Self.validate (addr)
   Datei "/Users/tomas/Dropbox/Broadnet/broadpy/lib/broadpy/addrtools.py", Zeile 692, in validieren
     Wenn self._correction_citytypo (addr): zurück
   Datei "/Users/tomas/Dropbox/Broadnet/broadpy/lib/broadpy/addrtools.py", Zeile 943, in _correction_citytypo
     Ratio = lev_ratio (old_city, city)
 TypeError: ratio erwartet zwei Strings oder zwei Unicodes 

Nun enthält die Datei "addrtools.py" auf Zeile 943 die Antwort auf mein Problem. Ich möchte den Typ und die Werte von old_city und city im Bereich sehen, in dem die Ausnahme erhoben wird. Ich habe diese Art von Problem die ganze Zeit, und eine schnelle und schmerzlose Methode der Verwendung von pdb zu Inspektion der Einheimischen in den Umfang, wo die Ausnahme erhoben wird, würde mir viel Zeit in der Zukunft sparen.


Ich habe versucht, die Lösung in der Antwort auf diese Frage veröffentlicht , aber die Post-mortem-Funktion stellt mich in python2.7 / unittest / main.py (231) runTests (), die mir nicht viel hilft. Ich denke, das ist, weil die Ausnahme gefangen und wieder aufgehoben aus dem unbescheidenen Code.

2 Solutions collect form web for “Was ist der einfachste Weg, um Python pdb zu verwenden, um die Ursache einer unbehandelten Ausnahme zu untersuchen?”

Wickeln Sie es mit:

 def debug_on(*exceptions): if not exceptions: exceptions = (AssertionError, ) def decorator(f): @functools.wraps(f) def wrapper(*args, **kwargs): try: return f(*args, **kwargs) except exceptions: pdb.post_mortem(sys.exc_info()[2]) return wrapper return decorator 

Beispiel:

 @debug_on(TypeError) def buggy_function() .... raise TypeError 

Die pdb Nase hat eine Option, die Sie zu pdb fällt, wenn ein Test fehlschlägt, wenn es Ihnen gut geht, die Nase als Testläufer zu benutzen:

 --pdb Drop into debugger on errors --pdb-failures Drop into debugger on failures 
  • Wie brechst du in den Debugger aus dem Python-Quellcode?
  • Pdb mit kill signal eingeben
  • Wie exportiere ich eine Variable vom PDB?
  • PDB.run - Neustart einer pdb-Sitzung
  • Kann ich mit Python-Debugger debuggen, wenn du py.test irgendwie benutzt?
  • Rerun-Code beim Debuggen und beim erneuten Laden aller Module
  • Interrupt (Pause) läuft Python-Programm in pdb?
  • Schritt-für-Schritt-Debugging mit IPython
  • Mit ipdb zum Debuggen von Python in emacs
  • Wie ändere ich einen Wert beim Debuggen von python mit pdb?
  • Python Unit Testing: Automatisches Ausführen des Debuggers, wenn ein Test fehlschlägt
  • Python ist die beste Programmiersprache der Welt.