2024-06-28 19:29:33 发布
网友
我正在尝试做类似于以下的事情:
try: 1/0 except ZeroDivisionError as e: import ipdb; ipdb.set_trace()
当我进入调试器时,我希望异常实例e位于本地范围内。但是,如果我运行此脚本,我发现情况并非如此:
e
为什么没有定义e?我目前正在使用print语句来查找e的属性,但我觉得这应该可以交互地完成。在
print
ipdb.set_trace()不会立即触发IPDB。它在下一个trace event上触发,在您的例子中,是函数即将返回的时候。在
ipdb.set_trace()
python3删除except块末尾的e变量,to break traceback reference cycles。不幸的是,在IPDB触发之前就发生了这种情况。在
except
您可以使用的一种解决方法是在set_trace之后添加另一行,这样IPDB就会触发'line'事件:
set_trace
'line'
try: 1/0 except ZeroDivisionError as e: import ipdb ipdb.set_trace() workaround = True
另一个选择是使用事后调试,这不需要等待跟踪事件:
不过,事后调试与常规调试有许多重要区别。它将您放在异常发生的(通常是死的)堆栈框架中,而不是post_mortem调用发生的堆栈框架中。在你的例子中,那些恰好是同一个框架,但通常不是这样。访问引发异常的堆栈帧是非常好的,您仍然可以导航到捕获异常的帧(但由于Python不寻常的回溯系统,不能再进一步),但这仍然是一个主要的区别。在
post_mortem
而且,你不能进入验尸模式。尝试运行next或step将退出调试。在
next
step
实际上,您可以使用^{}来访问回溯上下文
import ipdb; ipdb.post_mortem() ipdb> e ZeroDivisionError('division by zero',)
ipdb.set_trace()
不会立即触发IPDB。它在下一个trace event上触发,在您的例子中,是函数即将返回的时候。在python3删除
except
块末尾的e
变量,to break traceback reference cycles。不幸的是,在IPDB触发之前就发生了这种情况。在您可以使用的一种解决方法是在
set_trace
之后添加另一行,这样IPDB就会触发'line'
事件:另一个选择是使用事后调试,这不需要等待跟踪事件:
^{pr2}$不过,事后调试与常规调试有许多重要区别。它将您放在异常发生的(通常是死的)堆栈框架中,而不是
post_mortem
调用发生的堆栈框架中。在你的例子中,那些恰好是同一个框架,但通常不是这样。访问引发异常的堆栈帧是非常好的,您仍然可以导航到捕获异常的帧(但由于Python不寻常的回溯系统,不能再进一步),但这仍然是一个主要的区别。在而且,你不能进入验尸模式。尝试运行
next
或step
将退出调试。在实际上,您可以使用^{} 来访问回溯上下文
相关问题 更多 >
编程相关推荐