75

sを処理AssertionErrorして、スタック トレースの不要な部分をユーザーから隠し、エラーが発生した理由とユーザーがそれに対して何をすべきかについてのメッセージを出力したいと考えています。

ブロックassert内で失敗した行またはステートメントを見つける方法はありますか?except

try:
    assert True
    assert 7 == 7
    assert 1 == 2
    # many more statements like this
except AssertionError:
    print 'Houston, we have a problem.'
    print
    print 'An error occurred on line ???? in statement ???'
    exit(1)

これをすべての assert ステートメントに追加する必要はありません。

assert 7 == 7, "7 == 7"

情報を繰り返すからです。

4

2 に答える 2

83

トレースバックモジュールを使用します。

import sys
import traceback

try:
    assert True
    assert 7 == 7
    assert 1 == 2
    # many more statements like this
except AssertionError:
    _, _, tb = sys.exc_info()
    traceback.print_tb(tb) # Fixed format
    tb_info = traceback.extract_tb(tb)
    filename, line, func, text = tb_info[-1]

    print('An error occurred on line {} in statement {}'.format(line, text))
    exit(1)
于 2012-07-20T21:37:03.310 に答える