корректная обработка ошибки, когда чат занят другим клиентом
This commit is contained in:
parent
649834beae
commit
79ccc2c4c6
1 changed files with 21 additions and 0 deletions
|
|
@ -4,6 +4,8 @@ import aiohttp
|
|||
import asyncio
|
||||
from urllib.parse import urljoin
|
||||
|
||||
from aiohttp import WSServerHandshakeError
|
||||
|
||||
from lambda_agent_api.server import *
|
||||
from lambda_agent_api.client import *
|
||||
|
||||
|
|
@ -88,6 +90,25 @@ class AgentApi:
|
|||
await self._session.close()
|
||||
raise
|
||||
|
||||
except WSServerHandshakeError as e: # если при открытии подключения сервер вернул какую-то ошибку
|
||||
if self._session and not self._session.closed:
|
||||
await self._session.close()
|
||||
|
||||
# во-первых, aiohttp зачем-то приводит WS коды ошибок к HTTP.
|
||||
# во-вторых, делает он это некорректно. Любой неизвестный код WS ошибки становится 403 HTTP
|
||||
# в-третьих, он не передает оригинальное сообщение об ошибке.
|
||||
# Т. е. какое бы сообщение сервер не отправлял, тут всегда будет "Invalid response status"
|
||||
# см. site-packages\aiohttp\client.py, line 1104, in _ws_connect
|
||||
# итого понять реальную причину ошибки почти невозможно. Нужно менять библиотеку
|
||||
# сейчас сервер специально кидает только ошибку с WS кодом 1008 Policy Violation, когда внутри ловит ChatBusyError
|
||||
# поэтому скорее всего, если мы получили WSServerHandshakeError с 403, то это внутренний ChatBusyError
|
||||
if e.status != 403:
|
||||
# обрабатываем как обычную ошибку WS по примеру except блока ниже
|
||||
raise AgentException(code="CONNECTION_ERROR",
|
||||
details=f"Failed to connect agent {self.id}: {e}") from e
|
||||
|
||||
raise AgentBusyException(f"Chat {self.chat_id} is already in use by other client")
|
||||
|
||||
except Exception as e:
|
||||
# Обработка всех остальных ошибок (например, aiohttp.ClientConnectionError)
|
||||
if self._ws and not self._ws.closed:
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue