Est-il possible de savoir si il y a une exception une fois que vous êtes dans l' finally
clause? Quelque chose comme:
try:
funky code
finally:
if ???:
print('the funky code raised')
Je cherche à faire quelque chose comme cela, plus SEC:
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)
Je n'aime pas qu'il a besoin pour attraper une exception, que vous n'avez pas l'intention de manipuler, juste pour définir un indicateur.
Depuis quelques commentaires demandent moins de "M" dans le MCVE, voici un peu plus de fond sur les cas d'utilisation. Le problème réel est d'environ escalade des niveaux de journalisation.
- Le funky code par un tiers et ne peut pas être changé.
- L'échec de l'exception et de la trace de la pile ne contient pas des informations de diagnostic utiles, donc à l'aide d'
logger.exception
dans un bloc except n'est pas utile ici. - Si le funky code élevés, puis quelques informations que j'ai besoin de voir a déjà été enregistré, au niveau de DÉBOGAGE. Nous ne sommes pas et ne peut pas gérer l'erreur, mais que vous voulez de dégénérer la journalisation de DÉBOGAGE parce que l'information nécessaire est là.
- Le funky code ne soulève pas, la plupart du temps. Je ne veux pas aggraver les niveaux de journalisation pour le cas général, car il est trop verbeux.
Par conséquent, le code s'exécute sous un log de capture du contexte (qui met en place des gestionnaires personnalisés pour intercepter les enregistrements de journal) et certaines informations de débogage obtient re-connecté de façon rétrospective:
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)