2016-07-30 3 views
6

Когда-нибудь, я не могу определить, когда и то, что вызывает его, PDB не поможет с кодом, как:Почему pdb не может получить доступ к переменной, содержащей исключение?

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

Вы в конечном итоге с обычным проворная, но при попытке получить доступ к e приведет к:

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

это не все время, конечно, и это происходит на Linux, Windows, моя машина, моя коллега машина ...

+1

подтверждено, что Python 3 Только; он работает (как и ожидалось) в Python 2. –

ответ

7

В Python 3, мишенью except .. as target заявления очищается, когда свита выходы. Из try statement documentation:

Когда исключение было назначено с использованием в качестве target, он очищается в конце, за исключением пункта. Это как если бы

except E as N: 
    foo 

был переведен на

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

Это означает, что исключение должно быть назначено на другое имя, чтобы иметь возможность обратиться к нему после того, как за исключением п. Исключения очищаются, поскольку с привязкой к ним трассировки они образуют цикл ссылок с фреймом стека, сохраняя все локали в этом фрейме до тех пор, пока не произойдет следующая сборка мусора.

Вызов pdb.set_trace() эффективно выходит из блока, так что неявное finally люкс выше выполняется.

переплета исключение с другим именем:

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

Демонстрация:

>>> 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",) 
Смежные вопросы