获取pdb中的最后一个异常

Mar*_*cin 18 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.我想在修改代码之前检查异常.

cdo*_*orn 9

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

__exception__
Run Code Online (Sandbox Code Playgroud)

以上实际上是(异常,消息)的元组.

  • “名称错误:名称'\_\_异常\_\_'未定义” (6认同)

unu*_*tbu 8

这是你想要的?

import pdb
try:
    1/0
except Exception as err:
    pdb.set_trace()
Run Code Online (Sandbox Code Playgroud)
% 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
Run Code Online (Sandbox Code Playgroud)

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

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

1/0
Run Code Online (Sandbox Code Playgroud)
% 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) 
Run Code Online (Sandbox Code Playgroud)


fal*_*tru 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",)
Run Code Online (Sandbox Code Playgroud)
>>> 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",)
Run Code Online (Sandbox Code Playgroud)

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

  • 我得到:`***AttributeError:'module'对象没有属性'last_value' (22认同)
  • @falsetru` - > print 1/0`,`(Pdb)n`,`ZeroDivisionError:'integer division or modulo by zero'`,`(Pdb)import sys`,`(Pdb)print sys.last_value`,`***AttributeError:'module'对象没有属性'last_value'` - 它不存在(python 2.6) (8认同)