fix(binance_client, ticker_stream, user_data_stream): 增强异常处理和日志记录

在 `binance_client`、`ticker_24h_stream` 和 `user_data_stream` 中优化了异常处理逻辑,确保在发生错误时记录详细的错误类型和信息。更新了日志格式,以便于后续排查和监控。同时,增加了对请求超时的处理,提升了系统的稳定性和可追溯性。
This commit is contained in:
薇薇安 2026-02-16 16:51:22 +08:00
parent ec5c76c546
commit dfbdfee596
3 changed files with 36 additions and 6 deletions

View File

@ -294,17 +294,31 @@ class BinanceClient:
headers = {"X-MBX-APIKEY": self.api_key}
async with aiohttp.ClientSession() as session:
async with session.post(url, headers=headers, timeout=aiohttp.ClientTimeout(total=10)) as resp:
text = await resp.text()
if resp.status != 200:
text = await resp.text()
logger.warning(f"create_futures_listen_key 失败 status={resp.status} body={text}")
logger.warning(
"create_futures_listen_key 失败 status=%s body=%s",
resp.status, (text[:500] if text else ""),
)
return None
data = await resp.json()
try:
data = json.loads(text) if (text and text.strip()) else {}
except Exception:
data = {}
key = data.get("listenKey") if isinstance(data, dict) else None
if key:
logger.info("✓ 合约 User Data Stream listenKey 已创建")
return key
except asyncio.TimeoutError:
logger.warning("create_futures_listen_key 失败: 请求超时(可检查该账号网络或代理)")
return None
except Exception as e:
logger.warning(f"create_futures_listen_key 失败: {e}")
err_msg = getattr(e, "message", str(e)) or repr(e)
logger.warning(
"create_futures_listen_key 失败: %s - %s",
type(e).__name__, err_msg,
exc_info=logger.isEnabledFor(logging.DEBUG),
)
return None
async def keepalive_futures_listen_key(self, listen_key: str):

View File

@ -93,7 +93,13 @@ class Ticker24hStream:
except asyncio.CancelledError:
break
except Exception as e:
logger.warning(f"Ticker24hStream: WS 异常 {e}10s 后重连")
err_msg = getattr(e, "message", str(e)) or repr(e)
err_type = type(e).__name__
logger.warning(
"Ticker24hStream: WS 异常 %s: %s10s 后重连",
err_type, err_msg,
exc_info=logger.isEnabledFor(logging.DEBUG),
)
await asyncio.sleep(10)
self._ws = None
if not self._running:

View File

@ -222,7 +222,13 @@ class UserDataStream:
except asyncio.CancelledError:
break
except Exception as e:
logger.warning(f"UserDataStream: WS 异常 {e}60s 后重连")
err_msg = getattr(e, "message", str(e)) or repr(e)
err_type = type(e).__name__
logger.warning(
"UserDataStream(account_id=%s): WS 异常 %s: %s60s 后重连",
self.account_id, err_type, err_msg,
exc_info=logger.isEnabledFor(logging.DEBUG),
)
await asyncio.sleep(60)
self._ws = None
self._conn_start_time = None
@ -231,6 +237,10 @@ class UserDataStream:
# 重连前重新创建 listenKey旧 key 可能已失效或 listenKeyExpired
self._listen_key = await self.client.create_futures_listen_key()
if not self._listen_key:
logger.warning(
"UserDataStream(account_id=%s): 重新创建 listenKey 失败60s 后重试(请检查该账号 API 权限/网络/IP 白名单)",
self.account_id,
)
await asyncio.sleep(60)
continue