tonado raise gen.Return 错误

发布于 2022-09-02 12:09:44 字数 914 浏览 11 评论 0

最近在使用 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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

べ映画 2022-09-09 12:09:44

楼主,把try except去掉,try except 见raise便抓,改为如下,应该可以

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() 
           
怎樣才叫好 2022-09-09 12:09:44

Python2.x中,生成器不能直接return 值,所以Tornado把值包在一个特殊的异常里返回出来,这个异常就是gen.Return,所以你的try..except会抓到这个异常并报错,所以改下BaseHandler.args_kwargs的代码,可参照:
BTW.貌似args_kwargs里没有yield,貌似只是拿个参数而已,没必要用gen.coroutine吧?

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()
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文