9
votes

Trouvez le nom du module de l'exception d'origine dans Python

Exemple:

>>> try:
...    myapp.foo.doSomething()
... except Exception, e:
...    print 'Thrown from:', modname(e)

Thrown from: myapp.util.url


0 commentaires

5 Réponses :


0
votes

Cela devrait faire l'astuce: xxx


3 commentaires

Cela renvoie le module dans lequel l'exception était définie , 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 ), mais pas la valeur de son __ nom __ ( myapp.util.url )



7
votes

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


2 commentaires

Le nom de fichier n'est pas le même que __ nom __


Le nom de fichier + linenumber est plus utile pour moi, alors j'apprécie cette réponse à la question :)



11
votes

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


3 commentaires

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.



0
votes

Le package de journalisation de Python prend déjà en charge cette page - Vérifiez le Documentation . Vous devez simplement spécifier % (module) S dans la chaîne de format. Cependant, cela vous donne le module où l'exception était prise - pas nécessairement la même que celle où elle était relevée . La trace de traçabilité vous donne bien sûr l'emplacement précis où l'exception a été soulevée.


2 commentaires

Je veux utiliser __ nom __ dans Logging.getlogger 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.



-1
votes

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.


0 commentaires