繁体   English   中英

在Tornado WebSocket on_message方法中忽略了异常

[英]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_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可能是一个协程,在处理第二个数据之前,你不会获得第二个数据块,并且未捕获的异常将中止连接)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM