gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:18:06 25 4
gpt4 key购买 nike

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

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

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

Kurts-MacBook-Pro-2:Scratch kurtpeek$ python debug_exception.py
--Return--
None
> /Users/kurtpeek/Documents/Scratch/debug_exception.py(4)<module>()
2 1/0
3 except ZeroDivisionError as e:
----> 4 import ipdb; ipdb.set_trace()

ipdb> dir()
['__annotations__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__return__', '__spec__', 'ipdb']
ipdb> e
*** NameError: name 'e' is not defined

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

最佳答案

ipdb.set_trace() 不会完全立即触发 IPDB。它在下一个 trace event 触发,在您的例子中,是在 except block 结束之后。

Python 3 删除了 except block 末尾的 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

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

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

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

此外,您无法进入事后分析模式。尝试运行 nextstep 将退出调试。

关于python - 在 Python 中,如何在 except block 中放入调试器并访问异常实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51290964/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com