【问题标题】:Python tornado tornado.iostream.StreamClosedErrorPython 龙卷风 tornado.iostream.StreamClosedError
【发布时间】:2018-05-29 12:45:53
【问题描述】:

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

例外:

ERROR:asyncio:Future 异常从未被检索到 未来: 回溯(最近一次通话最后): 文件“C:\Users\user\Anaconda3\lib\site-packages\tornado\websocket.py”,第 808 行,在包装器中 产量期货 运行中的文件“C:\Users\user\Anaconda3\lib\site-packages\tornado\gen.py”,第 1099 行 价值 = 未来。结果() tornado.iostream.StreamClosedError:流已关闭

在处理上述异常的过程中,又发生了一个异常:

Traceback(最近一次调用最后一次): 运行中的文件“C:\Users\user\Anaconda3\lib\site-packages\tornado\gen.py”,第 1107 行 产生 = self.gen.throw(*exc_info) 文件“C:\Users\user\Anaconda3\lib\site-packages\tornado\websocket.py”,第 810 行,在包装器中 引发 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)

【问题讨论】:

    标签: python exception-handling tornado


    【解决方案1】:

    我在这里找到了答案:Catch errors in asyncio.ensure_future

    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 返回 future 后添加“await fut”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多