2009-12-11 3 views
8

Je suis en train de créer un outil où, lorsque les exceptions se propagent vers le haut, de nouvelles données sur le contexte de l'exception sont ajoutées à l'exception. Le problème est qu'au moment où l'exception atteint le niveau supérieur, toutes les données de contexte supplémentaires sont présentes, mais seule la toute dernière trace de pile est affichée. Existe-t-il un moyen facile d'avoir une exception montrant la trace de la pile d'origine dans laquelle elle a été lancée au lieu de la dernière trace de pile, ou devrais-je faire quelque chose comme saisir la trace de pile originale la première fois que l'exception se propage?Python Exception Propagation

Par exemple, le code suivant:

def a(): 
    return UNBOUND 
def b(): 
    try: 
     a() 
    except Exception as e: 
     raise e 
b() 

donne l'exception suivante:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    b() 
    File "test.py", line 7, in b 
    raise e 
NameError: global name 'UNBOUND' is not defined 

où, idéalement, je voudrais montrer en quelque sorte l'utilisateur ceci:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    File "test.py", line 2, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

Comme cela pointe l'utilisateur à la ligne sur laquelle l'erreur s'est produite initialement.

Répondre

26

Les exceptions Python sont un peu comme java, il existe un moyen de provoquer la réapparition de l'exception sans tronquer la pile. Utilisez raise sans argument. Le résultat, il:

Traceback (most recent call last): 
    File "./exc.py", line 11, in <module> 
    b() 
    File "./exc.py", line 7, in b 
    a() 
    File "./exc.py", line 4, in a 
    return UNBOUND 
NameError: global name 'UNBOUND' is not defined 

Vous pouvez modifier certaines choses sur l'objet e, même si vous venez raise sans cet argument - par exemple:

e.args = ("hi!",) 
raise 

changera en fait le message d'exception. Vous pouvez probablement changer les autres options de cette façon - sans détruire la pile.

Questions connexes