2016-07-30 12 views
6

Sometime, nie mogę określić, kiedy i co jest przyczyną tego, PDB nie pomoże z kodem jak:Dlaczego pdb nie może uzyskać dostępu do zmiennej zawierającej wyjątek?

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

skończyć z zwykle szybka, ale próbuje uzyskać dostęp e doprowadzi do:

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

to nie jest cały czas oczywiście, i to się dzieje na Linux, Windows, mojego komputera, mój komputer kolega ...

+1

potwierdza się jedynie Pythona 3; działa (zgodnie z oczekiwaniami) w Pythonie 2. –

Odpowiedz

7

W Pythonie 3, celem instrukcji except .. as target rozjaśnia gdy pakiet wyjścia. Z try statement documentation:

Kiedy wyjątek został przypisany stosując jako target, to jest usuwany na końcu z wyjątkiem klauzuli. To jest tak, jakby

except E as N: 
    foo 

został przetłumaczony na

except E as N: 
    try: 
     foo 
    finally: 
     del N 

Oznacza to wyjątek musi być przypisany do innej nazwy, aby móc się do niego po wyjątkiem klauzuli. Wyjątki są usuwane, ponieważ z dołączonym do nich sprzężeniem zwrotnym tworzą cykl odniesienia z ramką stosu, utrzymując wszystkich mieszkańców w tej ramce przy życiu aż do następnego wywołania śmieci.

Wywołanie pdb.set_trace() skutecznie kończy działanie bloku, więc domyślny pakiet finally jest wykonywany.

Bind wyjątek inną nazwą:

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",) 
Powiązane problemy