web-dev-qa-db-ja.com

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_について知っています。コードを変更する前に、例外を調べたいと思います。

20
Marcin

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は設定されません。

7
falsetru

これはあなたが探しているものですか?

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) 
8
unutbu

Pdb/ipdbの最新の例外は、次の方法で取得できます。

__exception__

上記は実際には(例外、メッセージ)のタプルです。

8
cdosborn