2012-08-31 9 views
7

私は、どのようにするべきかを定義するためにassertが使用されているPythonプログラムを持っていて、AssertionErrorをスローするのではなく、read-eval-loopで異常をキャプチャしたいとします。確かにAssertionErrorでPythonを強制的にデバッグすることはできますか?

、私は

if (reality!=expectation): 
    print("assertion failed"); 
    import pdb; pdb.set_trace(); 

を持つことができますが、それははるかに醜いコードにプレーンassert(reality==expectation)よります。

except:ブロックで呼び出されたpdb.set_trace()がトップレベルにある可能性がありますが、失敗のコンテキストをすべて失ってしまいました。 (例外オブジェクトからはスタックトレースを回復できますが、引数の値などはありません)

--magicコマンドラインフラグのように、Python3インタプリタを必要なものにすることはできますか?

+0

eclipseを使用し、ブレークポイントでデバッグモードで実行しますか? –

+0

@ JoranBeasley:あなたはいつもIDEを持っているとは限りません。例:sshシェルにログオンしているとき。 – Constantinius

+1

その後、コマンドラインからpdbを使用してブレークポイントを使用する... http://www.doughellmann.com/PyMOTW/pdb/ 'python -m pdb somescript.py'はあなたの' --magic'です –

答えて

4

noseプロジェクトをご覧ください。 --pdb optionと一緒に使用すると、エラー時にデバッガにドロップできます。

+0

単体テストを行う人にとっては便利だと思いますが、ここでやっていることではありません。 – PypeBros

11

this great snippetから撮影:

import sys 

def info(type, value, tb): 
    if hasattr(sys, 'ps1') or not sys.stderr.isatty() or type != AssertionError: 
     # we are in interactive mode or we don't have a tty-like 
     # device, so we call the default hook 
     sys.__excepthook__(type, value, tb) 
    else: 
     import traceback, pdb 
     # we are NOT in interactive mode, print the exception... 
     traceback.print_exception(type, value, tb) 
     print 
     # ...then start the debugger in post-mortem mode. 
     pdb.pm() 

sys.excepthook = info 

あなたはこれであなたのコードを初期化すると、すべてのAssertionError sがPDBを呼び出す必要があります。

+0

それを試してみよう... – PypeBros

+0

ここでは「死後モード」が必須であり、 'pdb.set_trace()'は役に立たないでしょうか? – PypeBros

+0

私は実際にはここで確信していない、私はあなたが試してみる必要がありますね。 – Constantinius

関連する問題