2013-03-08 31 views
5

會發生什麼情況是,如果您的代碼引發了運行時異常並且完成無效,則不知道爲什麼,因爲回溯未打印。試試這個非常短的代碼,看看我的意思是:程序應該在c = 2+「ddda」上崩潰,顯然你要添加一個字符串和一個int,這根本行不通。但是,除了崩潰之外,這種例外情況會被發現並且你不知道發生了什麼。該程序繼續運行,好像什麼都沒有發生。如何在使用cmd python模塊時使程序正常崩潰?

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() 

我的問題是:如何在出現錯誤時顯示錯誤? (使用cmd模塊時)。

+0

如果代碼沒有在處理錯誤的try塊中調用,它應該停止並返回一個錯誤和回溯。 – Barmar 2013-03-08 22:54:27

回答

5

不幸的是,完成者中的例外被捕獲到readline的黑暗深處。你可以嘗試這樣的事情:

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' 

調試完成者之後取下裝飾,因爲從裏面的ReadLine打印回溯可以搞砸你的終端。

 

不,你不能readline的崩潰容易。

+0

謝謝。我喜歡你的解決方案。我在cmd模塊中搜索了try/catch塊,沒有發現任何可疑內容。你對readline的解釋似乎是一個合理的線索,裝飾者是一個實際的解決方案。再次感謝。 – ychaouche 2013-03-08 23:09:26

+0

另外,如果所有人都想打印回溯,traceback.print_exc()是另一個簡寫。 – ychaouche 2013-03-09 13:40:34

+0

它打印到'stderr',readline也顯然被抑制。 – 2013-03-09 13:45:33