13

假设我有一个 python 程序,其中 assert 已用于定义事情应该如何,并且我想用 read-eval-loop 捕获异常而不是AssertionError被抛出。

当然,我本来可以

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

但这在代码中比普通的assert(reality==expectation).

我本可以在顶层pdb.set_trace()调用一个块,但是我会丢失所有失败的上下文,对吗?except:(我的意思是,可以从异常对象中恢复堆栈跟踪,但不能从参数值等中恢复)

有没有类似--magic命令行标志的东西可以将 python3 解释器变成我需要的?

4

2 回答 2

15

主要取自这个伟大的片段

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

当你用这个初始化你的代码时,所有AssertionError的 s 都应该调用 pdb。

于 2012-08-31T14:45:00.517 回答
5

看看鼻子项目。您可以将它与--pdb 选项一起使用,以便在出现错误时进入调试器。

于 2012-08-31T14:44:52.123 回答