Выбор ответа Senior asyncio обновлено

CancelledError и except Exception

Вопрос

Почему except Exception: внутри корутины не перехватывает отмену задачи?

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

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

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

Коротко

Правильный ответ: CancelledError наследуется от BaseException (с 3.8). Отмена реализована как исключение CancelledError, которое бросается в точке await внутри задачи.

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

  1. CancelledError наследуется от BaseException (с 3.8)правильный ответ
  2. Отмена не бросает исключений, задача просто исчезает из цикла
  3. CancelledError бросается в цикле событий, а не в корутине
  4. except Exception вообще не работает в корутинах

Разбор

Отмена реализована как исключение CancelledError, которое бросается в точке await внутри задачи. Его специально вывели из-под Exception, чтобы широкие обработчики не глотали отмену и таймауты продолжали работать. Если ловите его для очистки, пробрасывайте дальше (raise). Задача не исчезает молча, и except Exception в корутинах работает как обычно.

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

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