【发布时间】:2020-10-28 23:17:02
【问题描述】:
考虑以下示例:
try:
raise ValueError('test')
except ValueError as err:
breakpoint() # at this point in the debugger, name 'err' is not defined
这里,输入breakpoint后,调试器无法访问绑定到err的异常实例:
$ python test.py
--Return--
> test.py(4)<module>()->None
-> breakpoint()
(Pdb) p err
*** NameError: name 'err' is not defined
为什么会这样?如何访问异常实例?目前我正在使用以下解决方法,但感觉很尴尬:
try:
raise ValueError('test')
except ValueError as err:
def _tmp():
breakpoint()
_tmp()
# (lambda: breakpoint())() # or this one alternatively
有趣的是,使用这个版本,我还可以在调试器中向上移动一帧时访问绑定异常err:
$ python test.py
--Return--
> test.py(5)_tmp()->None
-> breakpoint()
(Pdb) up
> test.py(6)<module>()
-> _tmp()
(Pdb) p err
ValueError('test')
通过dis反汇编
在下面我比较了两个版本,一个直接使用breakpoint,另一个将它包装在自定义函数_breakpoint中:
def _breakpoint():
breakpoint()
try:
raise ValueError('test')
except ValueError as err:
breakpoint() # version (a), cannot refer to 'err'
# _breakpoint() # version (b), can refer to 'err'
dis 的输出类似,当然除了一些内存位置和函数名称:
所以它必须是允许pdb 引用绑定异常实例的附加堆栈帧。但是不清楚为什么会出现这种情况,因为在 except 块内任何东西都可以引用绑定的异常实例。
【问题讨论】:
-
好问题:)
-
出于好奇,您用来查找文本之间差异的应用程序的名称是什么?
-
@JRodDynamite 它叫Meld。
标签: python python-3.x exception breakpoints pdb