在Python中,如何在except块中放入调试器并访问异常实例?

2024-06-28 19:29:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试做类似于以下的事情:

try:
    1/0
except ZeroDivisionError as e:
    import ipdb; ipdb.set_trace()

当我进入调试器时,我希望异常实例e位于本地范围内。但是,如果我运行此脚本,我发现情况并非如此:

^{pr2}$

为什么没有定义e?我目前正在使用print语句来查找e的属性,但我觉得这应该可以交互地完成。在


Tags: 实例import脚本定义astrace情况事情
2条回答

ipdb.set_trace()不会立即触发IPDB。它在下一个trace event上触发,在您的例子中,是函数即将返回的时候。在

python3删除except块末尾的e变量,to break traceback reference cycles。不幸的是,在IPDB触发之前就发生了这种情况。在

您可以使用的一种解决方法是在set_trace之后添加另一行,这样IPDB就会触发'line'事件:

try:
    1/0
except ZeroDivisionError as e:
    import ipdb
    ipdb.set_trace()
    workaround = True

另一个选择是使用事后调试,这不需要等待跟踪事件:

^{pr2}$

不过,事后调试与常规调试有许多重要区别。它将您放在异常发生的(通常是死的)堆栈框架中,而不是post_mortem调用发生的堆栈框架中。在你的例子中,那些恰好是同一个框架,但通常不是这样。访问引发异常的堆栈帧是非常好的,您仍然可以导航到捕获异常的帧(但由于Python不寻常的回溯系统,不能再进一步),但这仍然是一个主要的区别。在

而且,你不能进入验尸模式。尝试运行nextstep将退出调试。在

实际上,您可以使用^{}来访问回溯上下文

import ipdb; ipdb.post_mortem()

ipdb> e
ZeroDivisionError('division by zero',)

相关问题 更多 >