Je voudrais écrire une fonction dans Python (2.6) qui peut déterminer si elle est appelée à partir du code de gestion des exceptions quelque part dans la pile.En Python, comment savoir s'il est appelé par un code de gestion d'exception?
Ceci est destiné à une utilisation de journalisation spécialisée. Dans le module logging
de python, l'appelant doit spécifier explicitement que les informations d'exception doivent être consignées (soit en appelant logger.exception()
, soit en utilisant le mot-clé exc_info
). Je voudrais que mon enregistreur le fasse automatiquement, selon qu'il est appelé depuis le code de gestion des exceptions.
Je pensais que vérifier sys.exc_info() pourrait être la réponse, mais il renvoie également des informations d'exception à partir d'une exception déjà traitée. (A partir du docs: "Cette fonction renvoie un ensemble de trois valeurs qui fournissent des informations sur l'exception actuellement gérée ... Si le cadre de pile actuel ne gère pas une exception, les informations sont extraites de la trame de la pile appelante, son appelant, et ainsi de suite jusqu'à ce qu'un cadre de pile se trouve qui est la manipulation d'exception. ici, « traitement d'une exception » est défini comme « l'exécution ou avoir exécuté une exception clause. » ")
en outre, puisque je veux que ceci soit transparent à l'appelant, je ne veux pas devoir employer exc_clear()
ou n'importe quoi d'autre dans la clause except
.
Quelle est la bonne façon de procéder?
Comment le contexte d'appel peut-il être ambigu? Vous définissez une fonction ** à appeler à partir d'une exception **. C'est toujours appelé d'une exception. Quel est le problème? Veuillez donner une idée de la raison pour laquelle une fonction conçue pour être appelée à partir d'une exception ne serait pas appelée à partir d'une exception. –
Je n'ai pas défini cela comme une fonction à appeler à partir d'une exception. C'est une fonction qui peut être appelée à partir d'une exception ou qui peut être appelée à partir d'une non-exception. Je veux déterminer quel est le cas. –
Ummm ... Qu'est-ce qui ne va pas avec la définition de votre fonction pour qu'elle ** doive être appelée à partir d'une exception? Qu'est-ce qui vous empêche de changer la définition de la fonction pour simplifier cela? –