[英]Exception ignored in Tornado WebSocket on_message method
我有以下课程:
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
类继承的用户定义的异常。
引发此异常时,龙卷风控制台不会显示任何内容。 但是,当我在它们周围添加try / except子句时,会拾取异常。 我不明白为什么这个异常没有传播到控制台。 其他异常例如,MongoDB中的重复键被传播并显示到控制台。
[这个答案适用于龙卷风4.4及更早版本。 从Tornado 4.5 on_message
可能是一个协程,原始问题中的代码将工作]
协程的调用与常规函数不同(即必须使用yield
调用它们)。 因此,当您定义框架调用的方法时,只应在文档说“此方法可能是协程”时使用协程。 WebSocketHandler.on_message
可能不是协程(从Tornado 4.3开始)。
相反,您可以使用IOLoop.spawn_callback
从on_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.locks
和tornado.queues
模块中的方法来管理这种并发。 (相比之下,在RequestHandler.data_received
, 可能是一个协程,在处理第二个数据之前,你不会获得第二个数据块,并且未捕获的异常将中止连接)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.