假设我有一个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解释器变成我需要的东西?
答案 0 :(得分:11)
主要来自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
使用此代码初始化代码时,所有AssertionError
都应调用pdb。
答案 1 :(得分:4)
查看nose项目。您可以将其与--pdb option一起使用,以便在出现错误时插入调试器。