Получить последнее исключение в pdb

Есть ли способ изучить последнее исключение, когда в 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. Я хотел бы изучить исключение, прежде чем изменять код.

Ответ 1

Вы можете использовать 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 не установлено.

Ответ 2

Это то, что вы ищете?

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)