获取pdb中的最后一个异常

时间:2013-10-06 16:19:09

标签: python exception python-2.7 pdb

有没有办法在输入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。我想在修改代码之前检查异常。

5 个答案:

答案 0 :(得分:8)

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

__exception__

以上实际上是(例外,消息)的元组。

答案 1 :(得分:7)

这是你在找什么?

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) 

答案 2 :(得分:7)

您可以使用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

答案 3 :(得分:1)

您可以通过python -m pdb -c continue script.py通过pdb运行脚本。它将在未捕获的异常上进行事后调试,并将您放入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>)

答案 4 :(得分:0)

我碰到了这篇文章,但是没有一个答案满足我的需要,那就是重复在问题的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()之前的所有错误信息。