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 
  • Pdb mit kill signal eingeben
  • Wie stelle ich sys.excepthook ein, um pdb global in python aufzurufen?
  • PDB.run - Neustart einer pdb-Sitzung
  • Wie ändere ich einen Wert beim Debuggen von python mit pdb?
  • Schritt-für-Schritt-Debugging mit IPython
  • Wie sehen Sie eine Variable in pdb
  • Python (pdb) - Ausschalten der Befehle zum Ausführen
  • So führen Sie mehrzeilige Anweisungen in Pythons eigenem Debugger (PDB) aus
  • Python ist die beste Programmiersprache der Welt.