Python 在asyncio.wait中捕获异常
我有一个通过websocket连接从Python服务器获取消息的应用程序。如果客户端在此期间断开连接,服务器将无法发送消息。我想利用这一点,并在发生这种情况时提出一个异常,以便正确地清理而不出现大量错误Python 在asyncio.wait中捕获异常,python,python-3.x,websocket,python-asyncio,Python,Python 3.x,Websocket,Python Asyncio,我有一个通过websocket连接从Python服务器获取消息的应用程序。如果客户端在此期间断开连接,服务器将无法发送消息。我想利用这一点,并在发生这种情况时提出一个异常,以便正确地清理而不出现大量错误 async def status(websocket, message): try: print("\nDEBUG: "+message) await asyncio.wait([websocket.send(message)])
async def status(websocket, message):
try:
print("\nDEBUG: "+message)
await asyncio.wait([websocket.send(message)])
except:
raise Abort()
当客户端断开连接时,此函数将引发错误
DEBUG: Waiting for sale to start
Task exception was never retrieved
future: <Task finished name='Task-79' coro=<WebSocketCommonProtocol.send() done, defined at C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\site-packages\websockets\protocol.py:521> exception=ConnectionClosedError('code = 1006 (connection closed abnormally [internal]), no reason')>
Traceback (most recent call last):
File "C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\site-packages\websockets\protocol.py", line 827, in transfer_data
message = await self.read_message()
File "C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\site-packages\websockets\protocol.py", line 895, in read_message
frame = await self.read_data_frame(max_size=self.max_size)
File "C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\site-packages\websockets\protocol.py", line 971, in read_data_frame
frame = await self.read_frame(max_size)
File "C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\site-packages\websockets\protocol.py", line 1047, in read_frame
frame = await Frame.read(
File "C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\site-packages\websockets\framing.py", line 105, in read
data = await reader(2)
File "C:\Users\321vi\AppData\Local\Programs\Python\Python38\lib\asyncio\streams.py", line 721, in readexactly
raise exceptions.IncompleteReadError(incomplete, n)
asyncio.exceptions.IncompleteReadError: 0 bytes read on a total of 2 expected bytes
我还尝试剥离
asyncio.wait()
并使用simplewebsocket.send()
,但这在这个应用程序中不起作用。我对Python的未来
没有经验,因此非常感谢您的帮助。从技术上讲,我可以使用心跳检查连接是否每次都处于活动状态,但这可能会占用更多的网络资源,因此我不希望这样做。如果您只等待一个协程,请直接执行,异常将自然传播:
try
print("\nDEBUG: "+message)
await websocket.send(message)
except Exception:
raise Abort()
没有理由使用设计用于等待多个任务的asyncio.wait
。将其用于一个协同程序会产生大量开销:在一个元素集中创建、调度、运行并最终返回一个新任务,其结果必须在单独的步骤中进行检查。这基本上就是最后一段代码的作用
简单的websocket.send(message)
(当使用async def
定义时)没有wait
实际上什么都不做。从技术上讲,它从一个协程函数创建一个coutroutine对象,但该coutroutine不会执行。如果您只等待一个协程,请直接执行,异常将自然传播:
try
print("\nDEBUG: "+message)
await websocket.send(message)
except Exception:
raise Abort()
没有理由使用设计用于等待多个任务的asyncio.wait
。将其用于一个协同程序会产生大量开销:在一个元素集中创建、调度、运行并最终返回一个新任务,其结果必须在单独的步骤中进行检查。这基本上就是最后一段代码的作用
简单的websocket.send(message)
(当使用async def
定义时)没有wait
实际上什么都不做。从技术上讲,它从一个协程函数创建一个couroutine对象,但该couroutine不会执行。如果我不使用asyncio.wait()
,它不会发送任何消息或引发任何异常。在使用asyncio.get\u event\u loop.run\u直到\u complete()
运行的初始函数中,simplewebsocket.send()
起作用。当控件转到它之外的任何函数时,它停止发送消息。这是另一个问题。请给出一个简单的示例()。@VishalDS您只需删除asyncio.wait()
,但保留wait
,使其成为wait websocket.send(message)
。这当然可以。@user4815162342我已经在使用wait-websocket.send()
,但它在主目录之外不起作用function@VishalDS和wait asyncio.wait([websocket.send(…)])
在完全相同的代码中工作?这很有趣。如果我不使用asyncio.wait()
,它不会发送任何消息或引发任何异常。在使用asyncio.get\u event\u loop.run\u直到\u complete()
运行的初始函数中,simplewebsocket.send()
起作用。当控件转到它之外的任何函数时,它停止发送消息。这是另一个问题。请给出一个简单的示例()。@VishalDS您只需删除asyncio.wait()
,但保留wait
,使其成为wait websocket.send(message)
。这当然可以。@user4815162342我已经在使用wait-websocket.send()
,但它在主目录之外不起作用function@VishalDS和wait asyncio.wait([websocket.send(…)])
在完全相同的代码中工作?这很有趣。答案显示了如何正确执行此操作,但作为参考,您应该知道future.exception()
返回一个异常对象,因此正确的检查类似于如果future.exception()是websockets.ConnectionClosedError:…
。答案显示了如何正确执行此操作,但是作为参考,您应该知道future.exception()
返回一个异常对象,因此正确的检查类似于如果future.exception()是websockets.ConnectionClosedError:…
。