Ну и для общей осведомлённости
TaskGroup специально спроектирован таким образом, чтобы отмена отдельной дочерней задачи не считалась ошибкой всей группы.
Ещё интересное то что asyncio.CancelledError наследуется непосредственно от BaseException, а не от Exception.
по этому такой код не перехватит CancelledError
try:
task.cancel()
await task
except Exception:
pass
❤2