Выбор ответа Senior Исключения и контекстные менеджеры обновлено
Исключение в переменной и утечка памяти
Вопрос
Почему Python удаляет имя e после выхода из блока except Exception as e:?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Traceback держит кадры с e: без del будет цикл ссылок. В конце except ... as e Python неявно выполняет del e.
Варианты ответа
- Чтобы исключение нельзя было бросить повторно после блока
- Traceback держит кадры с
e: безdelбудет цикл ссылокправильный ответ - Это известная ошибка интерпретатора, которую не чинят
- Имя не удаляется,
eдоступно после блока как обычно
Разбор
В конце except ... as e Python неявно выполняет del e. Причина: e.__traceback__ ссылается на кадр, а кадр на переменную e, получается цикл, который удерживал бы все локальные переменные кадра до прохода сборщика. Если исключение нужно сохранить, его присваивают другому имени, понимая цену. Повторно бросить исключение внутри блока можно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.