Как правильно обрабатывать исключения в асинхронном коде?

Почему код не перехватывает исключение, даже используя блок `try/except`, когда работает с `asyncio`?
  • 15 июня 2024 г. 11:11
Ответы на вопрос 2
При работе с асинхронным кодом в Python, обработка исключений требует немного другого подхода. В асинхронном коде исключения, возникшие в корутинах, не могут быть перехвачены с помощью обычного блока `try/except`, как в синхронном коде.

Для обработки исключений в асинхронном коде рекомендуется использовать конструкцию `asyncio.gather()`, которая позволяет объединять несколько корутин в одну и обрабатывать исключения централизованно. Также можно использовать конструкцию `try/except` внутри корутины и использовать функцию `asyncio.ensure_future()` для запуска корутины.

Вспомогательные функции, такие как `asyncio.to_thread()` или `asyncio.wrap_future()`, могут также помочь в обработке исключений в асинхронном коде.

Если код не перехватывает исключение даже с использованием блока `try/except` и работая с `asyncio`, это может быть связано с тем, что исключение возникает вне контекста корутины или обрабатывается не в том месте. Рекомендуется проверить расположение конструкции `try/except` и убедиться, что она находится в нужном месте внутри корутины или с помощью `asyncio.gather()`.
1. обрабатывай не на уровне вызова create_task, а на уровне exc, либо уровнем выше create_task или там где ожидаешь ответ. 
2. а зачем тебе run_forever? давно уже run используют
Начал гуглить и наткнулся на подобный вопрос.
на год вопроса и ответов тоже обращай внимание
Похожие вопросы