冗長またはデバッグフラグが設定されていない場合、トレースバックエラーを非表示にする慣用的なpython方法は何ですか?
サンプルコード:
their_md5 = 'c38f03d2b7160f891fc36ec776ca4685'
my_md5 = 'c64e53bbb108a1c65e31eb4d1bb8e3b7'
if their_md5 != my_md5:
raise ValueError('md5 sum does not match!')
現在、既存の出力ですが、foo.py --debug
で呼び出された場合にのみ必要です。
Traceback (most recent call last):
File "b:\code\apt\apt.py", line 1647, in <module>
__main__.__dict__[command] (packages)
File "b:\code\apt\apt.py", line 399, in md5
raise ValueError('md5 sum does not match!')
ValueError: md5 sum does not match!
望ましい通常の出力:
ValueError: md5 sum does not match!
テストスクリプトは次のとおりです。 https://Gist.github.com/maphew/e3a75c147cca98019cd8
短い方法はsys
モジュールを使用し、次のコマンドを使用することです:
sys.tracebacklimit = 0
フラグを使用して動作を決定します。
例:
>>> import sys
>>> sys.tracebacklimit=0
>>> int('a')
ValueError: invalid literal for int() with base 10: 'a'
より良い方法は、 exception hook を使用することです。
def exception_handler(exception_type, exception, traceback):
# All your trace are belong to us!
# your format
print "%s: %s" % (exception_type.__name__, exception)
sys.excepthook = exception_handler
それでも元のフックにフォールバックするオプションが必要な場合:
def exception_handler(exception_type, exception, traceback, debug_hook=sys.excepthook):
if _your_debug_flag_here:
debug_hook(exception_type, exception, traceback)
else:
print "%s: %s" % (exception_type.__name__, exception)
これで、デバッグフックをハンドラーに渡すことができますが、ほとんどの場合、常にsys.excepthook
で作成されたものを使用する必要があります(したがって、debug_hook
で何も渡しません)。 Pythonはデフォルトの引数をバインドしますonce)定義時間(よくある落とし穴...)置き換えられる前の元のハンドラ。
try:
pass # Your code here
except Exception as e:
if debug:
raise # re-raise the exception
# traceback gets printed
else:
print("{}: {}".format(type(e).__name__, e))