Python 龙卷风 tornado.iostream.StreamClosedError

Python tornado tornado.iostream.StreamClosedError

我有一个 python tornado websocket 处理程序,它工作得很好。但是,偶尔当使用 websocket 连接关闭选项卡时,它会抛出我无法捕获的异常。这只发生在 Firefox 上,所以我怀疑这可能是一些内部错误。异常不会中断代码的执行,但我仍然希望能够捕获所有异常。

例外情况:

ERROR:asyncio:Future exception was never retrieved future: Traceback (most recent call last): File "C:\Users\user\Anaconda3\lib\site-packages\tornado\websocket.py", line 808, in wrapper yield fut File "C:\Users\user\Anaconda3\lib\site-packages\tornado\gen.py", line 1099, in run value = future.result() tornado.iostream.StreamClosedError: Stream is closed

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "C:\Users\user\Anaconda3\lib\site-packages\tornado\gen.py", line 1107, in run yielded = self.gen.throw(*exc_info) File "C:\Users\user\Anaconda3\lib\site-packages\tornado\websocket.py", line 810, in wrapper raise WebSocketClosedError() tornado.websocket.WebSocketClosedError

这里是 on_message 函数的代码:

async def on_message(self, message):
    print(message)
    while True:
        try:
            #print('ws_connections: ', self.ws_connection, self.ws_connection.stream.socket)
            _fut = self.write_message(self.users[self].request_data())
        except tornado.iostream.StreamClosedError as e:
            print('StreamClosedError:', e)
            break
        except tornado.websocket.WebSocketClosedError as e:
            print('WebSocketClosedError:', e)
            break
        except KeyError as e:
            print('KeyError:', e)
            break
        await gen.sleep(1)

我在这里找到了答案:

async def on_message(self, message):
    print(message)
    while True:
        try:
            self.ping(b'ping')
            fut = self.write_message(self.users[self].request_data())
            await fut
        except tornado.iostream.StreamClosedError as e:
            print('StreamClosedError:', e)
            break
        except tornado.websocket.WebSocketClosedError as e:
            print('WebSocketClosedError:', self)
            break
        except KeyError as e:
            print('KeyError:', e)
            break
        await gen.sleep(5)

我只需要在我从 self.write_message 回来后添加 'await fut'。