有没有办法在输入pdb之前检查pdb /中的最后一个异常? (使用python 2.7.5)。
在我的代码中引发异常后, 立即(是的,我没有输入任何其他命令),我sys.exc_info()
;这只会产生(None, None, None)
。此时,我可以执行pdb.pm()
,并且pdb在引发异常时开始。
我希望能够检查这个异常对象(它在被引发之前不存储在变量中)。
http://docs.python.org/2/library/pdb.html或http://docs.python.org/2/library/sys.html
中没有任何明显的帮助编辑:我知道set_trace
。我想在修改代码之前检查异常。
答案 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()
之前的所有错误信息。