Выбор ответа Senior Исключения и контекстные менеджеры обновлено

ExceptionGroup и except*

Вопрос

Что делает except* ValueError при перехвате ExceptionGroup("g", [ValueError(), TypeError()])?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Обрабатывает подгруппу ValueError, TypeError летит дальше. except (3.11+) разбивает группу: в ветку попадает ExceptionGroup только с подходящими исключениями, остальные проверяются следующими ветками except, а необработанные перебрасываются наружу группой.

Варианты ответа

  1. Ловит всю группу целиком, потому что в ней есть ValueError
  2. Не срабатывает: except* работает только с одиночными исключениями
  3. Обрабатывает подгруппу ValueError, TypeError летит дальшеправильный ответ
  4. Ловит ValueError и молча подавляет TypeError из группы

Разбор

except* (3.11+) разбивает группу: в ветку попадает ExceptionGroup только с подходящими исключениями, остальные проверяются следующими ветками except*, а необработанные перебрасываются наружу группой. Обычный except ValueError группу бы не поймал, ведь её тип ExceptionGroup. Ничего не подавляется молча.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.