2016-07-30 4 views
6

Irgendwann, ich kann nicht erkennen, wann oder was es verursacht, PDB Sie nicht mit Code wie helfen:Warum kann pdb nicht auf eine Variable zugreifen, die eine Ausnahme enthält?

try: 
    foo() 
except Exception as e: 
    import pdb; pdb.set_trace() 

Sie am Ende mit der üblichen Eingabeaufforderung, aber e zuzugreifen versuchen, führen zu:

(pdb) e 
*** NameError: name 'e' is not defined. 

es ist nicht die ganze Zeit natürlich, und es geschieht auf linux, Windows, meine Maschine, mein Kollegen Maschine ...

+1

Bestätigte Python sein, nur 3; es funktioniert (wie erwartet) in Python 2. –

Antwort

7

In Python 3, das Ziel einer except .. as target Anweisung wird gelöscht, wenn die Suite beendet. Vom try statement documentation:

Wenn eine Ausnahme als target zugewiesen wurde verwendet, wird es am Ende der except-Klausel gelöscht. Das ist, als ob

except E as N: 
    foo 

zu

übersetzt wurde
except E as N: 
    try: 
     foo 
    finally: 
     del N 

Dies bedeutet, muss die Ausnahme von einem anderen Namen zugeordnet werden können, um es nach dem Ausnahme-Klausel beziehen. Ausnahmen werden gelöscht, da sie mit dem an sie angehängten Traceback einen Referenzzyklus mit dem Stack-Frame bilden und alle Locals in diesem Frame bis zur nächsten Garbage Collection am Leben erhalten.

Aufruf pdb.set_trace() effektiv den Block verlassen, so die implizite finally Suite oben ausgeführt wird.

Bind die Ausnahme von einem anderen Namen:

try: 
    foo() 
except Exception as e: 
    exception = e 
    import pdb; pdb.set_trace() 

Demo:

>>> try: 
...  foo() 
... except Exception as e: 
... exception = e 
... import pdb; pdb.set_trace() 
... 
--Return-- 
> <stdin>(5)<module>()->None 
(Pdb) e 
*** NameError: name 'e' is not defined 
(Pdb) exception 
NameError("name 'foo' is not defined",) 
Verwandte Themen