WebSocket调用unsubscribe遇1006异常,程序中断问题求助
原因分析
- 1006错误本质:这是WebSocket的异常关闭码,意味着连接在未完成正常关闭流程时被强制断开。问题出在
KucoinWsClient的后台逻辑——调用unsubscribe后,客户端可能直接关闭了连接,但后台负责监听消息的协程还在运行,协程抛出未捕获的异常导致程序崩溃。 - try-except覆盖范围有限:你只捕获了
unsubscribe方法本身的异常,但WebSocket客户端的后台任务(比如消息接收协程)抛出的异常不在当前try块范围内,所以程序依然会终止。 - 消息处理函数潜在风险:如果
deal_futures_msg在处理消息时抛出未捕获的异常,也会导致后台协程崩溃,进而引发连接异常关闭。
解决方案
1. 捕获WebSocket客户端全局异常
给事件循环设置全局异常处理器,避免未捕获的异常终止程序:
import asyncio def handle_loop_exception(loop, context): err_msg = context.get("exception", context["message"]) print(f"事件循环异常: {err_msg}") async def main(): loop = asyncio.get_event_loop() loop.set_exception_handler(handle_loop_exception) # 原main函数逻辑...
如果SDK支持异常回调参数,修改订阅函数:
async def subscribe_to_spot_topic(client, topic, order_book): def handle_client_exception(e): print(f"WebSocket客户端异常: {e}") ws_client = await KucoinWsClient.create( None, client, lambda msg: deal_futures_msg(order_book, msg), private=False, on_exception=handle_client_exception # 假设SDK支持该参数,以实际文档为准 ) try: await ws_client.subscribe(topic) return ws_client except Exception as e: print(f"订阅出错: {e}")
2. 完整关闭WebSocket客户端
不要只调用unsubscribe,需调用客户端的close方法(如果存在),确保后台协程被正确终止:
async def unsubscribe_to_spot_topic(ws_client: KucoinWsClient, topic): if ws_client is not None: try: await ws_client.unsubscribe(topic=topic) await ws_client.close() # 调用客户端关闭方法,终止后台任务 await ws_client.wait_closed() # 等待连接完全关闭(如果SDK支持) print("成功取消订阅并关闭WebSocket连接") except Exception as e: print(f"取消订阅/关闭失败: {e}") else: print("WebSocket客户端未正确初始化")
3. 给消息处理函数添加异常捕获
确保deal_futures_msg不会因处理消息抛出未捕获的异常:
def deal_futures_msg(order_book, msg): try: # 原消息处理逻辑 pass except Exception as e: print(f"消息处理出错: {e}")
内容的提问来源于stack exchange,提问作者Paucar
相关产品推荐
相关产品推荐

