Python 处理WebSocket模块异常和错误

Python 处理WebSocket模块异常和错误,python,exception,websocket,python-asyncio,Python,Exception,Websocket,Python Asyncio,我正在尝试使用Python中的WebSocket模块创建一个简单的WebSocket服务器 我的任务是创建一个WebSocket服务器,将消息发送给所有正在侦听它的客户端。问题是,每次客户端断开连接时,WebSocket都会启动一个异常(ConnectionClosedOK或ConnectionClosedError,具体取决于发生的情况),我需要捕获该异常,因为我必须注销已断开连接的客户端,以便WebSocket停止在以太网上发送消息(并停止WebSocket服务器在每次尝试向关闭的客户端发送

我正在尝试使用Python中的WebSocket模块创建一个简单的WebSocket服务器

我的任务是创建一个WebSocket服务器,将消息发送给所有正在侦听它的客户端。问题是,每次客户端断开连接时,WebSocket都会启动一个异常(
ConnectionClosedOK
ConnectionClosedError
,具体取决于发生的情况),我需要捕获该异常,因为我必须注销已断开连接的客户端,以便WebSocket停止在以太网上发送消息(并停止WebSocket服务器在每次尝试向关闭的客户端发送消息时抛出这些异常)

以下是服务器的代码:

async def foo_call():
等待asyncio.sleep(3)
打印('Hi!')
异步def寄存器(websocket):
添加(websocket)
等待通知用户()
异步def注销(websocket):
用户。删除(websocket)
异步def启动(websocket,路径):
等待寄存器(websocket)
尝试:
等待foo_call()
除websockets.ConnectionClosedError外:
等待注销(websocket)
#正在侦听此WebSocket服务器的WebSocket客户端
users=set()
#打开WebSocket服务器
start_server=websockets.service(start,“localhost”,8765)
#运行异步IO事件循环
asyncio.get_event_loop()。运行_直到完成(启动服务器)
asyncio.get_event_loop().永远运行_()
这是回溯:

Task exception was never retrieved
future: <Task finished coro=<WebSocketCommonProtocol.send() done, defined at /home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py:521> exception=ConnectionClosedError('code = 1006 (connection closed abnormally [internal]), no reason',)>
Traceback (most recent call last):
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py", line 827, in transfer_data
    message = await self.read_message()
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py", line 895, in read_message
    frame = await self.read_data_frame(max_size=self.max_size)
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py", line 971, in read_data_frame
    frame = await self.read_frame(max_size)
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py", line 1051, in read_frame
    extensions=self.extensions,
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/framing.py", line 105, in read
    data = await reader(2)
  File "/usr/lib/python3.6/asyncio/streams.py", line 672, in readexactly
    raise IncompleteReadError(incomplete, n)
asyncio.streams.IncompleteReadError: 0 bytes read on a total of 2 expected bytes

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py", line 555, in send
    await self.ensure_open()
  File "/home/vlado/Projects/dahua/venv/lib/python3.6/site-packages/websockets/protocol.py", line 803, in ensure_open
    raise self.connection_closed_exc()
websockets.exceptions.ConnectionClosedError: code = 1006 (connection closed abnormally [internal]), no reason
从未检索到任务异常 未来: 回溯(最近一次呼叫最后一次): 文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/protocol.py”,第827行,在传输数据中 message=等待self.read_message() read_消息中的文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/protocol.py”,第895行 帧=等待自我。读取数据\u帧(最大大小=自我。最大大小) 文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/protocol.py”,第971行,读数据框 帧=等待自我读取帧(最大大小) 文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/protocol.py”,第1051行,读框 extensions=self.extensions, 文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/framing.py”,第105行,已读 数据=等待读卡器(2) 文件“/usr/lib/python3.6/asyncio/streams.py”,第672行,格式为READJUST 引发不完全读取错误(不完全,n) asyncio.streams.UncompleteReadError:总共读取了2个预期字节,读取了0个字节 上述异常是以下异常的直接原因: 回溯(最近一次呼叫最后一次): 文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/protocol.py”,第555行,在send中 等待自我。确保打开() 文件“/home/vlado/Projects/dahua/venv/lib/python3.6/site packages/websockets/protocol.py”,第803行,确保打开 提升自连接\u关闭\u exc() websockets.exceptions.ConnectionClosedError:code=1006(连接异常关闭[内部]),无原因
我真的不明白如何捕获websocket模块引发的异常。

我已使用websocket.close解决了此问题(如果连接已关闭,则为True),但我仍然想弄清楚如何捕获websocket模块引发的异常。弄清楚了吗?asyncio的套接字服务器也有同样的问题,无法捕获任何异常。@jupiterbjy不,我没有t@Vladoski嗨,你是说websocket.close()或者websocket.closed?你能用这个解决方案更新OP吗?@MPL你好,我的意思是websocket.closed。公平地说,这不是一个真正的解决方案,因为它不是我想要的(处理异常)。我只是在做:
如果websocket.closed:wait unregister(websocket)
where unregister只是从集合中删除websocket。附言:我是OP。