2012-08-31 7 views
7

Załóżmy, że mam program Pythona, w którym assert został użyty do zdefiniowania sposobu, w jaki powinien być, i chciałbym uchwycić anomalie z pętlą odczytu-ewaluacji, zamiast zgłaszać AssertionError.Czy mogę wymusić debugowanie pythona w AssertionError?

prawda, mogę mieć

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

ale to jest o wiele bardziej brzydkie w kodzie niż zwykły assert(reality==expectation).

Mogłem pdb.set_trace() zadzwonić w bloku except: na najwyższym poziomie, ale wtedy straciłbym cały kontekst awarii, prawda? (Mam na myśli, stacktrace mogłyby być odzyskane z obiektu wyjątku, ale nie wartości argumentów, itp.)

Czy istnieje coś takiego jak flaga linii poleceń, która mogłaby przekształcić interpretera python3 w to, czego potrzebuję?

+0

używać Eclipse i uruchomić go w trybie debugowania z punktem przerwania? –

+0

@JoranBeasley: Nie zawsze masz pod ręką IDE. np. kiedy jesteś zalogowany do powłoki SSH. – Constantinius

+1

następnie użyj pdb z wiersza poleceń i użyj punktów przerwań ... http://www.doughellmann.com/PyMOTW/pdb/ 'python -m pdb somescript.py' to twój' --magic' –

Odpowiedz

4

Zobacz projekt nose. Możesz go użyć z --pdb option, aby wprowadzić do debuggera błędy.

+0

Przypuszczam, że jest to przydatne dla tych, którzy przeprowadzają testy jednostkowe, ale to nie jest to, co tutaj robię. – PypeBros

11

Głównie pochodzą z this great snippet:

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 

Podczas inicjalizacji kodu z tym, wszystkie AssertionError s powinien powołać PDB.

+0

spróbuję tego ... – PypeBros

+0

Przypuszczam, że "tryb pośmiertny" jest tutaj obowiązkowy i nie ma szansy, że 'pdb.set_trace()' byłby przydatny, czyż nie? – PypeBros

+0

Naprawdę nie jestem pewien, chyba musisz spróbować. – Constantinius

Powiązane problemy