From dfbdfee59645d20b744b15798c57c751fd5ce965 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=96=87=E8=96=87=E5=AE=89?= Date: Mon, 16 Feb 2026 16:51:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(binance=5Fclient,=20ticker=5Fstream,=20user?= =?UTF-8?q?=5Fdata=5Fstream):=20=E5=A2=9E=E5=BC=BA=E5=BC=82=E5=B8=B8?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=92=8C=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在 `binance_client`、`ticker_24h_stream` 和 `user_data_stream` 中优化了异常处理逻辑,确保在发生错误时记录详细的错误类型和信息。更新了日志格式,以便于后续排查和监控。同时,增加了对请求超时的处理,提升了系统的稳定性和可追溯性。 --- trading_system/binance_client.py | 22 ++++++++++++++++++---- trading_system/ticker_24h_stream.py | 8 +++++++- trading_system/user_data_stream.py | 12 +++++++++++- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/trading_system/binance_client.py b/trading_system/binance_client.py index b83eb4a..29d1028 100644 --- a/trading_system/binance_client.py +++ b/trading_system/binance_client.py @@ -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): diff --git a/trading_system/ticker_24h_stream.py b/trading_system/ticker_24h_stream.py index 611d7f4..01a2299 100644 --- a/trading_system/ticker_24h_stream.py +++ b/trading_system/ticker_24h_stream.py @@ -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: %s,10s 后重连", + err_type, err_msg, + exc_info=logger.isEnabledFor(logging.DEBUG), + ) await asyncio.sleep(10) self._ws = None if not self._running: diff --git a/trading_system/user_data_stream.py b/trading_system/user_data_stream.py index 9e33a84..482e219 100644 --- a/trading_system/user_data_stream.py +++ b/trading_system/user_data_stream.py @@ -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: %s,60s 后重连", + 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