13

AssertionError物事がどうあるべきかを定義するためにassertが使用されているPythonプログラムがあり、スローされるのではなく、read-eval-loopで異常をキャプチャしたいとします。

確かに、私は

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

しかし、それは単純なコードよりもはるかに醜いですassert(reality==expectation)

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

--magicpython3インタープリターを必要なものに変えることができるコマンドラインフラグのようなものはありますか?

4

2 に答える 2

15

主にこの素晴らしいスニペットから抜粋:

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 を呼び出す必要があります。

于 2012-08-31T14:45:00.517 に答える
5

のプロジェクトを見てください。--pdb オプションとともに使用して、エラー時にデバッガーにドロップできます。

于 2012-08-31T14:44:52.123 に答える