22

有没有办法在 pdb 中/进入 pdb 之前检查最后一个异常?(使用python 2.7.5)。

在我的代码中引发异常后,立即sys.exc_info()(是的,我根本没有输入其他命令),我这样做;这只会导致(None, None, None). 此时,我可以做pdb.pm(),并且 pdb 从引发异常的点开始。

我希望能够检查这个异常对象(在引发之前它没有存储在变量中)。

http://docs.python.org/2/library/pdb.htmlhttp://docs.python.org/2/library/sys.html没有什么明显的帮助

编辑:我知道set_trace. 我想在修改代码之前检查异常。

4

5 回答 5

12

这是你想要的?

import pdb
try:
    1/0
except Exception as err:
    pdb.set_trace()

% test.py
--Return--
> /home/unutbu/pybin/test.py(8)<module>()->None
-> pdb.set_trace()
(Pdb) err
ZeroDivisionError('integer division or modulo by zero',)
(Pdb) quit

如果您不想修改引发异常的代码,则可以重新定义sys.excepthook

import pdb
import sys
def excepthook(type, value, traceback):
    pdb.set_trace()
sys.excepthook = excepthook

1/0

% test.py
--Return--
> /home/unutbu/pybin/test.py(7)excepthook()->None
-> pdb.set_trace()
(Pdb) type
<type 'exceptions.ZeroDivisionError'>
(Pdb) value
ZeroDivisionError('integer division or modulo by zero',)
(Pdb) traceback
<traceback object at 0xb774f52c>
(Pdb) 
于 2013-10-06T16:24:18.557 回答
11

您可以通过以下方式检索 pdb/ipdb 中的最新异常:

__exception__

上面其实是(异常,消息)的一个元组。

于 2018-03-29T19:53:19.603 回答
10

您可以使用sys.last_value

>>> no_such_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'no_such_var' is not defined
>>> import sys
>>> sys.last_value
NameError("name 'no_such_var' is not defined",)
>>> sys.last_value.args
("name 'no_such_var' is not defined",)

>>> no_such_var
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'no_such_var' is not defined
>>> import pdb, sys
>>> pdb.set_trace()
--Return--
> <stdin>(1)<module>()->None
(Pdb) sys.last_value
NameError("name 'no_such_var' is not defined",)

注意:此解决方案并不完美。当未处理异常并且解释器打印错误消息和堆栈回溯时设置该值。例如,如果使用 , 捕获异常try .. except ..sys.last_value则未设置。

于 2013-10-06T16:36:02.710 回答
1

pdb您可以通过via运行脚本python -m pdb -c continue script.py。它将在未捕获的异常上进入事后调试,并将您放入 pdb 界面。在这里您可以检查sys.exc_info()以获取异常。例如:

$ echo "1 / 0" > script.py 
$ python -m pdb -c continue script.py 
Traceback (most recent call last):
  [...]
  File "/tmp/script.py", line 1, in <module>
    1 / 0
ZeroDivisionError: division by zero
Uncaught exception. Entering post mortem debugging
Running 'cont' or 'step' will restart the program
> /tmp/script.py(1)<module>()
-> 1 / 0
(Pdb) !import sys
(Pdb) p sys.exc_info()
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x7f3adcf09148>)
(Pdb) interact
*interactive*
>>> import sys
>>> sys.exc_info()
(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x7f3adcf09148>)
于 2019-10-28T13:21:40.623 回答
1

我偶然发现了这篇文章,但没有一个答案符合我的需要,即重复pdb.pm()在问题步骤之前喷出的所有错误信息(包括回溯)。这最终对我有用:

将以下行添加到您的 .pdbrc 文件中:

import sys
import traceback
alias rethrow traceback.print_exception(sys.last_type, sys.last_value, sys.last_traceback)

现在,下次您在 pdb 环境中时,您只需键入rethrow,它将重复您键入之前的所有错误信息pdb.pm()

于 2020-12-08T13:23:00.877 回答