except ... as e удаляет e сам, без вашего участия

Вопрос простой на вид: «что выведет код с except Exception as e». Проверяют не знание исключений, а то, читали ли вы документацию буквально, а не по памяти из других языков.

В Python переменная, привязанная через as e, удаляется автоматически в конце блока except — как будто после него стоит del e. Это сделано намеренно: объект исключения держит ссылку на traceback, а через него — на кадры стека и локальные переменные, и без явного удаления это создавало бы циклы и держало память дольше нужного.

try: 1 / 0 except ZeroDivisionError as e: print(f"поймали: {e}") print(e)

Первый print отработает нормально. Второй упадёт с NameError: name 'e' is not defined — даже если до блока try переменной e вообще не было.

Ловушка усиливается, если нужно использовать e после блока: тогда её явно сохраняют в отдельную переменную внутри except, до выхода из блока. То же самое ломает код, если except обёрнут в условие — переменная исчезнет сразу после прохода блока, даже если условие было ложным и до исключения дело не дошло.

Знание этой детали отличает «читал туториал» от «читал PEP и документацию по try».

Тренажёр: 1900+ вопросов и задач, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки