Если ты до сих пор используешь asyncio.gather для параллельного запуска асинхронных тасок, пора обновляться. В Python 3.11 появились TaskGroup
import asyncio
async def fetch_user(user_id: int): ...
async def fetch_orders(user_id: int): ...
# ❌ Старый подход (при ошибке в одной таске остальные продолжают работать):
# users, orders = await asyncio.gather(fetch_user(1), fetch_orders(1))
# ✅ Современный подход через TaskGroup:
async def main():
async with asyncio.TaskGroup() as tg:
task1 = tg.create_task(fetch_user(1))
task2 = tg.create_task(fetch_orders(1))
# Сюда код попадет только когда ОБЕ таски завершатся
user = task1.result()
orders = task2.result()
Если одна таска падает с ошибкой, TaskGroup автоматически отменяет все остальные таски в группе и выбрасывает ExceptionGroup