Python 在asyncio.wait中捕获异常

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)])

我有一个通过websocket连接从Python服务器获取消息的应用程序。如果客户端在此期间断开连接,服务器将无法发送消息。我想利用这一点,并在发生这种情况时提出一个异常,以便正确地清理而不出现大量错误

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()
并使用simple
websocket.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()
运行的初始函数中,simple
websocket.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()
运行的初始函数中,simple
websocket.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:…