5

发生的情况是,如果您的代码引发运行时异常并且您的完成不起作用,您不知道为什么,因为没有打印回溯。试试这个非常短的代码,看看我的意思:程序应该在 c = 2+"ddda" 行崩溃,显然你正在添加一个字符串和一个 int,这根本行不通。但是不是崩溃,而是捕获了异常,您不知道发生了什么。程序继续运行,就好像什么都没发生一样。

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 模块时)。

4

1 回答 1

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 崩溃。

于 2013-03-08T22:57:04.277 回答