Подтвердить что ты не робот

Скрыть трассировку, если не установлен флаг отладки

Что такое идиоматический способ python для скрытия ошибок трассировки, если не установлен флаг verbose или debug?

Пример кода:

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!

Здесь тест script: https://gist.github.com/maphew/e3a75c147cca98019cd8

4b9b3361

Ответ 1

Короткий путь использует модуль sys и использует эту команду:

sys.tracebacklimit = 0

Используйте флаг для определения поведения.

Пример:

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

Лучше всего использовать и 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 связывает аргументы по умолчанию один раз во время определения (общая ошибка), что делает это всегда работать с тем же оригинальным обработчиком, перед заменой.

Ответ 2

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))