You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法修改导入库源码时如何用try/except捕获ConnectionResetError?

长连接ConnectionResetError防护方案

核心前提

你完全不需要修改Python标准库或者第三方依赖库的源码来处理这个异常。Python的异常会沿着调用栈逐层向上冒泡,只要在你自身业务代码的调用外层添加捕获逻辑,就可以接住库内部抛出的连接类异常。

这个ConnectionResetError: [Errno 104] Connection reset by peer是WebSocket长连接场景的预期内常见异常:持续运行数天的长连接很容易因为服务端超时回收、NAT/防火墙等中间网络设备清理空闲连接、临时网络波动等原因被对端强制断开,不属于不可修复的逻辑错误。

具体落地方案

  • 外层捕获异常 + 自动重连(通用首选方案)
    把你初始化客户端、启动订阅、持续接收消息的逻辑包裹在异常捕获块中,捕获连接相关的异常,触发异常后等待固定间隔重新建立连接即可,示例代码如下:

    import time
    # 替换为你实际的客户端导入、业务逻辑
    from py_graphql_client import Client
    
    SUBSCRIPTION_ENDPOINT = "你的GraphQL订阅地址"
    SUBSCRIPTION_QUERY = """
    # 替换为你实际的订阅查询语句
    subscription ExampleSub {
        dataUpdate {
            id
            content
        }
    }
    """
    
    def start_subscribe():
        # 初始化客户端、注册回调、启动订阅
        client = Client(SUBSCRIPTION_ENDPOINT)
        def on_message(data):
            # 替换为你实际的消息处理逻辑
            print("收到订阅消息:", data)
        
        sub = client.subscribe(
            query=SUBSCRIPTION_QUERY,
            on_data=on_message
        )
        sub.start()
    
    if __name__ == "__main__":
        # 常驻循环,异常断开就重连
        while True:
            try:
                start_subscribe()
            except (ConnectionResetError, ConnectionError, OSError):
                # 捕获标准库抛出的连接重置类异常
                print("连接被对端重置,5秒后尝试重连")
                time.sleep(5)
            except Exception as e:
                # 按需补充捕获依赖库抛出的其他连接关闭类异常
                print(f"订阅运行异常: {str(e)},5秒后尝试重连")
                time.sleep(5)
    

    提示:如果需要避免服务端故障时的高频重连打垮服务,可以给重连间隔加指数退避逻辑,重连等待时间从1秒逐步提升到最长30秒即可。

  • 开启心跳保活,降低异常断连概率
    大部分持续1天左右的断连都是因为连接长时间无数据传输,被中间网络节点判定为空闲连接强制回收。你在初始化客户端时可以透传参数给底层websocket连接,开启定期ping/pong心跳保活,维持连接活性:

    client = Client(
        SUBSCRIPTION_ENDPOINT,
        ping_interval=30,  # 每30秒发送一次心跳ping包
        ping_timeout=10    # 10秒未收到pong响应就判定连接失效
    )
    
  • 通用重连封装(多订阅场景适用)
    如果业务中有多处订阅逻辑,可以把重连逻辑封装为通用的订阅包装类,连接断开时自动重建连接、重新注册订阅,上层业务代码不需要感知重连过程。

避坑提醒

  • 不要直接修改Python安装目录下的标准库源码、或者第三方依赖的安装包源码,这类修改会在Python/依赖升级后被覆盖,且完全违背Python异常处理的设计逻辑。
  • 重连时必须新建客户端连接对象,不要复用已经断开的旧连接,同时要重新发送所有之前注册的订阅请求,避免重连后收不到消息。

内容的提问来源于stack exchange,提问作者Sander de Ruiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 11:27:22