recherche

Maison  >  Questions et réponses  >  le corps du texte

python - tonado raise gen.Return 错误

最近在使用 Tornado,用到 gen.coroutine 和 yield 配合,但是出了些问题,一直不明白!

代码:

class BaseHandler(tornado.web.RequestHandler):
    @gen.coroutine
    def args_kwargs(self,pro):
        try:
            kwargs = self.get_argument("data",None)
            if kwargs:
                code="-10000"
                raise gen.Return(code)
        except:
            print traceback.format_exc()

class EventAPIHandler(BaseHandler):
    @gen.coroutine
    def post(self):
        try:
            code = yield self.args_kwargs("event")
            if code:
                self.write(re_code[code])
                self.finish()
        except Exception,e:
            print traceback.format_exc()

错误为:

Traceback (most recent call last):
  File "server.py", line 124, in args_kwargs
    raise gen.Return(code)
Return

不能返回数据,请问有大神知道原因吗?请指教,非常感谢!

PHP中文网PHP中文网2888 Il y a quelques jours335

répondre à tous(2)je répondrai

  • 伊谢尔伦

    伊谢尔伦2017-04-17 17:32:03

    Original, veuillez supprimer le try sauf, attraper le try sauf lorsqu'il voit une relance, remplacez-le par ce qui suit, cela devrait fonctionner

    class BaseHandler(tornado.web.RequestHandler):
        @gen.coroutine
        def args_kwargs(self,pro):
            kwargs = self.get_argument("data", None)
            if kwargs:
                code = "-10000"
                raise gen.Return(code)
            else:
                raise gen.Return("xxx")
            
    class EventAPIHandler(BaseHandler):
        @gen.coroutine
        def post(self):
            try:
                code = yield self.args_kwargs("event")
                if code:
                    self.write(re_code[code])
                    self.finish()
            except Exception,e:
                err = traceback.format_exc()
                self.write(err)
                self.finish() 
               

    répondre
    0
  • 阿神

    阿神2017-04-17 17:32:03

    Dans Python2.x, le générateur ne peut pas directement return 值, donc Tornado enveloppe la valeur dans une exception spéciale et la renvoie Cette exception est gen.Return, donc votre essai..e. xcept interceptera cette exception et signalera une erreur, alors changez le code de BaseHandler.args_kwargs, veuillez vous référer à :
    BTW Il semble qu'il n'y ait pas de rendement dans args_kwargs, il semble que ce soit juste un paramètre là. il n'est pas nécessaire d'utiliser gen.coroutine, n'est-ce pas ?

    class BaseHandler(tornado.web.RequestHandler):
        @gen.coroutine
        def args_kwargs(self,pro):
            try:
                kwargs = self.get_argument("data",None)
            except Exception as e:
                print e
            else:
                code = "-10000" if kwargs else "0000000"
                raise gen.Return(code)
    
    
    class EventAPIHandler(BaseHandler):
        @gen.coroutine
        def post(self):
            try:
                code = yield self.args_kwargs("event")
                if code:
                    self.write(re_code[code])
                    self.finish()    # gen.coroutine会自动finish(),如果只是想结束连接,可把这一行替换为 return
            except Exception,e:
                print traceback.format_exc()

    répondre
    0
  • Annulerrépondre