gpt4 book ai didi

python - Tornado WebSocket on_message 方法中忽略异常

转载 作者:行者123 更新时间:2023-11-30 23:04:25 35 4
gpt4 key购买 nike

我有以下类(class):

class SessionHandler(tornado.websocket.WebSocketHandler):

@tornado.gen.coroutine
def on_message(self):
yield self.application.c.check("xxx@gmail.com")

check() 函数类似于

   @tornado.gen.coroutine
def check(self,id):

if id not in self.AUTH_METHOD.keys():
raise InvalidXX

InvalidXX 是一个用户定义的异常,继承自 Exception 类。

引发此异常时,tornado 控制台不会显示任何内容。但是,当我在它们周围添加 try/except 子句时,就会出现异常。我不明白为什么这个异常没有传播到控制台。其他异常(exception)MongoDB 中的重复键会传播并显示到控制台。

最佳答案

[此答案适用于 Tornado 4.4 及更早版本。从 Tornado 4.5 开始 on_message 可能是一个协程,原始问题中的代码将起作用]

协程的调用方式与常规函数不同(即它们必须使用 yield 调用)。因此,当您定义框架调用的方法时,只有当文档说“此方法可能是协程”之类的内容时,您才应该使用协程。 WebSocketHandler.on_message 可能不是协程(从 Tornado 4.3 开始)。

相反,您可以使用 IOLoop.spawn_callbackon_message 回调启动独立的协程。

def on_message(self, msg):
IOLoop.current().spawn_callback(process_message, msg)

@gen.coroutine
def process_message(self, msg):
...

这里的一个重要区别是 spawn_callback 将协程与接收消息的 WebSocketHandler 中的代码分离:您可能会收到第二个 on_message 调用在第一个回调中生成的回调完成之前。使用 tornado.lockstornado.queues 模块中的方法来管理此并发性。 (相比之下,在 RequestHandler.data_received 中,它可能是一个协程,在处理第二个数据 block 之前,您不会获得第二个数据 block ,并且会出现未捕获的异常将中止连接)

关于python - Tornado WebSocket on_message 方法中忽略异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33723830/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com