デバッグフラグが設定されていない場合はトレースバックを非表示にする 質問する

デバッグフラグが設定されていない場合はトレースバックを非表示にする 質問する

詳細フラグまたはデバッグフラグが設定されていない限り、トレースバックエラーを非表示にする慣用的な 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

ベストアンサー1

簡単な方法はsys、モジュールを使用して次のコマンドを使用することです。

sys.tracebacklimit = 0

フラグを使用して動作を決定します。

例:

>>> import sys
>>> sys.tracebacklimit=0
>>> int('a')
ValueError: invalid literal for int() with base 10: 'a'

より良い方法は、例外フック:

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はデフォルト引数をバインドします。一度定義時に(よくある落とし穴...)、置き換えられる前と同じ元のハンドラーで常に動作するようになります。

おすすめ記事