2010-06-08 10 views
2

En Python, j'ai le code qui attire une exception, comme ceci:Python: sys.exc_info() manque variables locales

try: 
    <do stuff> 
except: 
    exc_info = sys.exc_info() 

Le problème que je suis en cours d'exécution en est que l'objet retraçage (exc_info [ 2]) est des variables locales non déterministes dans les objets de traceback. Je sais cela pour un fait parce que je cours exactement le même code et parfois les variables sont dans tb.tb_frame.f_locals et parfois non. Les variables globales sont toujours correctes dans tb.tb_frame.f_globals.

Qu'est ce qui remplit la structure f_locals? Qu'est-ce qui pourrait parfois rendre ce dictionnaire de variables locales vide?

+1

Il semble qu'il doit y avoir un certain déterminisme dans votre code. Threads? Réseau E/S? N'importe quoi? –

+1

Je serais d'accord avec Ned; tb_frame est vraiment l'image du code appelant, et si la variable n'est pas là alors elle n'est pas définie. Eh bien, notez que les exceptions re-levées conservent leur objet tb, alors peut-être que le cadre ne pointe pas vers la portée que vous pensez être? –

Répondre

0

Ce qui est dans les sections locales dépend complètement du code dans ce contexte local. Par exemple:

if condition: 
    foo='foo' 
else: 
    bar='bar' 

si condition==True alors foo sera dans locals() et bar ne sera pas, sinon bar sera en locals() et foo seront pas.

Questions connexes