Exemple:
>>> try: ... myapp.foo.doSomething() ... except Exception, e: ... print 'Thrown from:', modname(e) Thrown from: myapp.util.url
5 Réponses :
Cela devrait faire l'astuce:
Cela renvoie le module dans lequel l'exception était définie i>, non?
@ Stephan202: désolé, mal compromis la question, la fonction ci-dessus vous donnera le nom du module qui a soulevé le problème.
Il renvoie le nom du module ( url code>), mais pas la valeur de son
__ nom __ code> (
myapp.util.url code>)
Vous pouvez utiliser le module de traceback , avec sys.exc_info () code>
, pour obtenir la traçabilité programmatique:
try: myapp.foo.doSomething() except Exception, e: exc_type, exc_value, exc_tb = sys.exc_info() filename, line_num, func_name, text = traceback.extract_tb(exc_tb)[-1] print 'Thrown from: %s' % filename
Le nom de fichier n'est pas le même que __ nom __ code>
Le nom de fichier + linenumber est plus utile pour moi, alors j'apprécie cette réponse à la question :)
Cela devrait fonctionner:
import inspect try: import bad_module except Exception, e: frm = inspect.trace()[-1] mod = inspect.getmodule(frm[0]) modname = mod.__name__ if mod else frm[1] print 'Thrown from', modname
En effet cela fonctionne. Notez qu'il y a un cas d'angle dans lequel il échouera, apparemment (juste essayé): si quelqu'un_bad_code () est une instruction d'importation qui provoque immédiatement une exception (en raison de certains code dans ledit module).
Bon point, Stephan202. J'ai fait une édition, ce que j'espère y remédierai correctement.
@ars j'ai mis en œuvre quelque chose comme ça récemment. Je pense que la défaillance d'un nom de fichier n'est pas suffisante - je regarde également via Sys.Path et si le nom du fichier est un enfant de l'une des entrées, je le fais relatif. Parfois, cela échoue, car toutes les importations ne sont pas de Sys.Path, mais si elle réussit, je peux ensuite retirer l'extension et remplacer ('\\' ',' /'.eplace('/ ', "." probablement obtenir le nom du module manquant.
Le package de journalisation de Python prend déjà en charge cette page - Vérifiez le Documentation . Vous devez simplement spécifier % (module) S code> dans la chaîne de format. Cependant, cela vous donne le module où l'exception était prise em> - pas nécessairement la même que celle où elle était relevée em>. La trace de traçabilité vous donne bien sûr l'emplacement précis où l'exception a été soulevée. P>
Je veux utiliser __ nom __ code> dans
Logging.getlogger code> argument et non dans la sortie de l'enregistreur.
Reculons un peu. Pourquoi est-il si important de l'avoir dans le nom de l'enregistreur? Vous pouvez trouver le fichier exact et le numéro de ligne lorsque l'exception a été lancée, ce qui semble être la chose la plus importante.
J'ai une histoire sur la manière dont CrashKit calcule les noms de classe et les noms de packages de Python Stack Traces sur la société Blog: " Python Stack Trace Saga ". Code de travail inclus. P>