Ответ 1
ipdb.set_trace()
не запускает IPDB сразу. Он запускает следующее событие трассировки, которое в вашем случае - это когда функция вот-вот вернется.
Python 3 удаляет переменную e
в конце блока except
, чтобы разбить контрольные циклы отслеживания. К сожалению, для вас это происходит до того, как IPDB может запускаться.
Одним из хакерских решений, которые вы могли бы использовать, было бы добавить еще одну строку после set_trace
, поэтому IPDB запускает событие 'line'
:
try:
1/0
except ZeroDivisionError as e:
import ipdb
ipdb.set_trace()
workaround = True
Другим вариантом было бы использовать посмертную отладку, которая не должна ждать события трассировки:
try:
1/0
except ZeroDivisionError as e:
import ipdb
ipdb.post_mortem()
Однако посмертная отладка имеет ряд важных отличий от обычной отладки. Он поместит вас в (как правило, мертвый) стек стека, где возникло исключение, а не в стек стека, где post_mortem
вызов post_mortem
. В вашем примере это один и тот же кадр, но обычно этого не будет. Наличие доступа к фрейму стека, в котором было создано исключение, довольно хорошо, и вы все же можете перейти к кадру, в котором было обнаружено исключение (но не более того, из-за необычной системы трассировки Python), но это все еще большое различие.
Кроме того, вы не можете перейти в посмертный режим. При попытке запустить next
или step
выйдет из отладки.