2013-03-08 13 views
5

Co się dzieje, że jeśli kod zgłasza wyjątek środowiska wykonawczego i że zakończenie nie działa, nie masz pojęcia, dlaczego, bo traceback nie zostanie wydrukowany. Spróbuj tego bardzo krótkiego kodu, aby zobaczyć, co mam na myśli: program powinien upaść na linii C = 2+ „ddda”, oczywiście jesteś dodając ciąg i int, który po prostu nie działa. Ale zamiast upaść, wyjątek jest złapany i nie masz pojęcia, co się dzieje. Program nadal działa, jak gdyby nic się nie stało.Jak mogę, aby mój program poprawnie się zawiesił podczas korzystania z modułu python cmd?

import cmd 

class App(cmd.Cmd): 
    def complete_foo(self,*arg): 
     # Uncommenting this line will silently crash the progrm 
     # making it hard to debug. 
     # Is there a way to force the program to crash ? 
     c = 2 + "ddda" 
     return "d dzpo idz dza dpaoi".split(" ") 

    def do_foo(self,*args): 
     print "foo" 
App().cmdloop() 

Moje pytanie brzmi: jak wyświetlić błąd, gdy taki występuje? (przy użyciu modułu cmd).

+0

Jeżeli kod nie jest wywoływana w 'try' bloku, który obsługuje ten błąd, należy zatrzymać się z powodu błędu i traceback. – Barmar

Odpowiedz

5

Niestety, wyjątki w zakończeniach są chwytane gdzieś w ciemnej głębi readline. Można spróbować coś takiego:

import cmd 
import traceback 

def log_exceptions(fun): 
    def wrapped(*a, **kw): 
     try: 
      return fun(*a, **kw) 
     except Exception: 
      print traceback.format_exc() 
      raise 

    return wrapped 

class App(cmd.Cmd): 
    @log_exceptions 
    def complete_foo(self,*arg): 
     # Uncommenting this line will silently crash the progrm 
     # making it hard to debug. 
     # Is there a way to force the program to crash ? 
     c = 2 + "ddda" 
     return "d dzpo idz dza dpaoi".split(" ") 

 

$ python c.py 
(Cmd) foo Traceback (most recent call last): 
    File "c.py", line 7, in wrapped 
    return fun(*a, **kw) 
    File "c.py", line 20, in complete_foo 
    c = 2 + "ddda" 
TypeError: unsupported operand type(s) for +: 'int' and 'str' 

Zdjąć dekorator po debugowania ukończyły, ponieważ drukowanie tracebacks od wewnątrz readline może zepsuć swój terminal.

 

Nie, nie może upaść readline łatwo.

+0

Dzięki. Podoba mi się twoje rozwiązanie. Szukałem bloku try/catch w module cmd i nie znalazłem nic podejrzanego. Twoje wyjaśnienie dotyczące readline wydaje się rozsądną wskazówką, a dekorator praktycznym rozwiązaniem. Dzięki jeszcze raz. – ychaouche

+0

Również traceback.print_exc() jest kolejnym skrótem, jeśli wszystko, co chcemy zrobić, to wydrukować traceback. – ychaouche

+0

To drukuje na 'stderr', którego readline również najwyraźniej tłumi. –

Powiązane problemy