Можно ли указать, было ли исключение, когда вы находитесь в предложении finally
? Что-то вроде:
try:
funky code
finally:
if ???:
print('the funky code raised')
Я хочу сделать что-то вроде этого более СУХОЙ:
try:
funky code
except HandleThis:
# handle it
raised = True
except DontHandleThis:
raised = True
raise
else:
raised = False
finally:
logger.info('funky code raised %s', raised)
Мне не нравится, что для этого требуется ловить исключение, которое вы не собираетесь обрабатывать, просто чтобы установить флаг.
Поскольку некоторые комментарии запрашивают меньше "М" в MCVE, вот еще несколько предположений в прецеденте. Реальная проблема заключается в эскалации уровней ведения журнала.
- Фанки-код является третьим лицом и не может быть изменен.
- Исключение сбоя и трассировка стека не содержат полезной диагностической информации, поэтому использование
logger.exception
вlogger.exception
блоке здесь не помогает. - Если фанковый код поднят, то некоторая информация, которую мне нужно увидеть, уже зарегистрирована на уровне DEBUG. Мы не справляемся с этой ошибкой и не можем ее обработать, но хотим эскалировать ведение журнала DEBUG, потому что там нужна информация.
- Фанки код не поднимается, большую часть времени. Я не хочу эскалации уровней регистрации в общем случае, потому что он слишком многословный.
Следовательно, код работает под контекстом захвата журнала (который настраивает пользовательские обработчики для перехвата записей журнала), и некоторая информация об отладке повторно записывается ретроспективно:
try:
with LogCapture() as log:
funky_code() # <-- third party badness
finally:
mylog = mylogger.WARNING if <there was exception> else mylogger.DEBUG
for record in log.captured:
mylog(record.msg, record.args)