Исключения: регистрация трассировки только один раз - PullRequest
0 голосов
/ 18 октября 2019

Я ломаю голову над тем, как лучше всего получать трассировку в лог-файле только один раз . Обратите внимание, что в целом я знаю, как получить трассировку в журнал.

Давайте предположим, что у меня есть большая программа, состоящая из различных импортируемых модулей и функций, так что она может иметь довольно большую глубину и регистраторнастроен правильно.

Всякий раз, когда может возникнуть исключение, я делаю следующее:

try:
    do_something()
except MyError as err:
    log.error("The error MyError occurred", exc_info=err)
    raise

Обратите внимание, что трассировка записывается в журнал с помощью опции exc_info=err.

Моя проблема теперь в том, что когда все становится немного сложнее и вложеннее, я теряю контроль над тем, как часто эта трассировка записывается в журнал, и она становится довольно грязной.

Пример ситуации с моим текущим решениемдля этой проблемы заключается в следующем:

from other_module import other_f

def main():

    try:
        # do something
        val = other_f()

    except (AlreadyLoggedError1, AlreadyLoggedError2, AlreadyLoggedError3):
        # The error was caught within other_f() or deeper and 
        # already logged with traceback info where it occurred
        raise
    except BroaderException as err:
        # I cannot expect to have thought of all exceptions
        # So in case something unexpected happened 
        # I want to have the traceback logged here
        log.error("An unecpected error occured", exc_info=err)
        raise

Проблема с этим решением заключается в том, что мне нужно отслеживать все исключения, которые уже зарегистрированы мной, и строка except (AlreadyLoggedError1, AlreadyLoggedError2, ...) становится произвольно длинной и имеетчтобы быть помещенным на любой уровень между main () и позицией, на которой действительно произошла ошибка.

Поэтому мой вопрос: есть ли что-то лучше? Г (питонический) способ справиться с этим? Чтобы быть более конкретным: я хочу поднять информацию о том, что исключение уже было зарегистрировано вместе с исключением, чтобы мне не приходилось учитывать это с помощью дополнительного блока кроме, как в моем примере выше.

...