Выбор ответа Senior asyncio обновлено
CancelledError и except Exception
Вопрос
Почему except Exception: внутри корутины не перехватывает отмену задачи?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: CancelledError наследуется от BaseException (с 3.8). Отмена реализована как исключение CancelledError, которое бросается в точке await внутри задачи.
Варианты ответа
CancelledErrorнаследуется отBaseException(с 3.8)правильный ответ- Отмена не бросает исключений, задача просто исчезает из цикла
CancelledErrorбросается в цикле событий, а не в корутинеexcept Exceptionвообще не работает в корутинах
Разбор
Отмена реализована как исключение CancelledError, которое бросается в точке await внутри задачи. Его специально вывели из-под Exception, чтобы широкие обработчики не глотали отмену и таймауты продолжали работать. Если ловите его для очистки, пробрасывайте дальше (raise). Задача не исчезает молча, и except Exception в корутинах работает как обычно.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.