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
_について知っています。コードを変更する前に、例外を調べたいと思います。
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
は設定されません。
これはあなたが探しているものですか?
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)
Pdb/ipdbの最新の例外は、次の方法で取得できます。
__exception__
上記は実際には(例外、メッセージ)のタプルです。