Я ломаю голову над тем, как лучше всего получать трассировку в лог-файле только один раз . Обратите внимание, что в целом я знаю, как получить трассировку в журнал.
Давайте предположим, что у меня есть большая программа, состоящая из различных импортируемых модулей и функций, так что она может иметь довольно большую глубину и регистраторнастроен правильно.
Всякий раз, когда может возникнуть исключение, я делаю следующее:
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 () и позицией, на которой действительно произошла ошибка.
Поэтому мой вопрос: есть ли что-то лучше? Г (питонический) способ справиться с этим? Чтобы быть более конкретным: я хочу поднять информацию о том, что исключение уже было зарегистрировано вместе с исключением, чтобы мне не приходилось учитывать это с помощью дополнительного блока кроме, как в моем примере выше.