pdb / ipdb проглатывает исключение в отладчике в Python 3

#python-3.x #python-2.7 #python-3.6 #pdb #ipdb

#python-3.x #python-2.7 #python-3.6 #pdb ( пдб ) #ipdb #pdb

Вопрос:

Информация о версии — Python 2.7.15; Python 3.6.5; ipdb==0.11

Я не могу получить доступ к перехваченному исключению err в Python 3 внутри отладчика ( pdb или ipdb ) в следующем коде. Он также недоступен в locals .

 try:
    raise ValueError("I am ValueError")
except ValueError as err:
    print("err={}".format(err))
    print("err" in locals())
    import pdb; pdb.set_trace() # not able to acess err in Python 3
  

ВЫВОД:

Python 2:

 err=I am ValueError
True
--Return--
> test_script.py(6)<module>()->None
-> import pdb; pdb.set_trace() # not able to acess err in Python 3
(Pdb) print("err" in locals())
True
  

Python 3:

 err=I am ValueError
True
--Return--
> test_script.py(6)<module>()->None
-> import pdb; pdb.set_trace() # not able to acess err in Python 3
(Pdb) print("err" in locals())
False  <------------------ BUG??
(Pdb)
  

Это происходит только внутри отладчика, так как err волшебным образом восстанавливается в locals после выхода (или никогда не входа) в отладчик.

 try:
    raise ValueError("I am ValueError")
except ValueError as err:
    print("err={}".format(err))
    print("err" in locals()) # True in both py2/3
    import pdb;
    print("err" in locals()) # True in both py2/3
  

Комментарии:

1. Присвойте исключению другое имя внутри except блока, тогда вы сможете получить к нему доступ.

2. @L3viathan попытался переименовать его в err123. Все еще не удается получить к нему доступ.

3. Я имею в виду: внутри блока except выполните err2 = err

4. @L3viathan Это на удивление работает! Я не уверен в причине.