#10520·discord.py

connect(): 初始握手失败,由 AttributeError: 'NoneType' 对象没有属性 'sequence' 所掩盖,重试循环被终止

作者: srvo创建于 2026年9月15日更新于 2026年9月15日

□ 总结

初始网关连接失败(即‘self.ws'从未被指定)时,‘Client.connect ()'与‘属性错误'相撞:'NoneType'对象没有属性'序列'',而没有显示真正的连接错误. 误导性的"属性错误"逃脱了重试处理器,因此"指数后退"重接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接回接接接接接回接接回接回接回接回接接回接回接接回接回接接接接接回接接回接接接接回接接接回接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接接

□ 版本( O)

district.py 2.7.1(也出现在 " master " 上——代码路径不变)

□ 回溯(真实的,来自生产日志)

根本的失败是网关上的503个:

连接中的文件"./discord/client.py",行728
self.ws = 等待 Ayncio.wait for(coro,超时=60.0)
. . . . . . . .
aiohttp.client exception. WSServerHandshakeError: 503,消息='Invalid response status',url='wss://gateway.discord.gg/?v=10&encoding=json&compress=zlib-stream' (中文(简体) ).

在处理上述例外情况时,出现了另一个例外情况:

文件 "./discord/client.py", 第851行,开始
等待自我. 连接( reconnect=reconnect)
文件"./discord/client.py",787行,连接中
序列=自己.ws.序列,
属性错误 : “ 无主题” 对象没有属性“ 序列 ”

□ 根源

在“Client.connect()”中:

  1. 第~728行:self.ws = 等待 Ayncio.wait for(coro,超时=60.0)'提高(此处为WSServer Handshake Error',为aiohttp'的子类。 客户端错误,因此被“除(OSError, HTTP Exception, Gateway NotFound, ConnectionClosed, aiohttp.ClientError, ayncio.TimeoutError)”处理器所捕获。 任务从不发生,因此self.ws'仍然是`none'——以前没有成功的联系可以恢复。
  2. 在 " 等待Ayncio.sleep(retrich) " 之后,处理者将恢复簿记:
zz
ws params.update (英语:
sequence=self.ws.sequence,#行~787 —self.ws是没有的
网关自有.ws.gateway,
恢复=真实,
session=self.ws.session id, (中文(简体) ).
(中文(简体) ).

这引起了属性错误',而“属性错误”在被捕获的拖累中不是****,因此它传播出连接()',杀死了重试回路并掩盖了原来的例外。

在 " OSError " 第54/10054号错误中,上面几行也有同样的危险。

注意此仅当 * no* 连接成功时触发 。 经过一次成功的一通一通'之后,self.ws'是非`无'的,处理者按原意工作——这大概就是为什么它无人注意的原因。

□再现.

任何初始连接的握手失败都会复制它而无需Discord:

[Python]

self.ws 是 None; 在失败从 client () 后模拟除手路径

客户端=不和。 客户端( intents = discord) 。 意图. 默认( ) 主张客户端.ws 是无 客户端. ws.sequence # 属性错误 — 这是~ 787 的行


或端到端:在网关URL上点出一个机器人,在websocket升级后返回503并呼叫"Client.start(token)"——上升的错误是"属性错误",而不是"WSServerHandshake Error",没有尝试重试.

□ 预期行为
. . . . . . .

内容来源: Rapptz/discord.py