2008-11-14 4 views
1

Quand une exception Python est lancée par le code qui couvre plusieurs lignes, par exemple:Python exception backtrace me dit où la ligne se termine, où commence-t-elle?

myfoos = [foo("bar", 
       "baz", 
       "quux", 
       i) for i in range(10)] 

Python rapportera le numéro de ligne de la dernière ligne, et affichera le fragment de code de cette ligne:

Traceback (most recent call last): 
    File "test.py", line 4, in <module> 
    i) for i in range(10)] 
NameError: name 'foo' is not defined 

Y at-il un moyen de déterminer ce qu'est la première ligne? Est-il possible d'attraper l'exception et de manipuler le pouvoir de signaler quelque chose comme ce lieu objet traceback:

Traceback (most recent call last): 
File "test.py", lines 1-4 in <module> 
    myfoos = [foo("bar", 
       "baz", 
       "quux", 
       i) for i in range(10)] 
NameError: name 'foo' is not defined 

Répondre

0

Dans un try/except vous pouvez excepter NameError et essayez de régler NameError.lineno, bien que je Je ne suis pas exactement sûr si ou comment cela fonctionne, mais c'est le meilleur que j'ai trouvé.

try: 
    somecode 
except NameError 
    NameError.lineno = [1,4] 

Vous devez savoir où la déclaration commence et se termine en quelque sorte ainsi que la déclaration qui soulève l'erreur.

Hope this helps

+0

La partie que je demande est de déterminer quand la déclaration commence et se termine. –

2

Trouver le début de la ligne sera vraiment difficile. Vous devrez soit analyser le Python ou peut-être creuser dans le code octet compilé. Il y a des modules dans la bibliothèque standard pour analyser Python, mais je peux vous dire par expérience que l'interprétation de leur sortie est un art noir. Et je ne suis pas sûr que le code octet compilé a la réponse non plus ...