Получить последнее исключение в 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)