您的位置:

解决方案:tornado Exception("should not be called")

  发布时间:2023-02-18 16:37:57
报错的原因在Tornado中通常是由于使用了不正确的回调函数或者手动调用了不应该被调用的方法所导致的。如何解决解决方法是检查代码并找出调用不正确的回调函数或方法的地方,并修改为正确的调用。如果是因为回调函数的问题,应该确保回调函数的参数正确,并且符合Tornado的要求。使用例子是的,这是一个使用不正确回调函数的示例如果我们将`MainHandler`中的`get`方法替换为其他函数,例如`get_data`,这个程序就会抛出的异常,因为Tornado的RequestHandler类默认只接受等方法。

报错的原因

"Exception("should not be called")"在Tornado中通常是由于使用了不正确的回调函数或者手动调用了不应该被调用的方法所导致的。这种异常通常表明代码中存在bug,应该修改代码。

如何解决

解决方法是检查代码并找出调用不正确的回调函数或方法的地方,并修改为正确的调用。如果无法确定问题所在,可以使用调试工具来帮助定位问题。

如果是因为回调函数的问题,应该确保回调函数的参数正确,并且符合Tornado的要求。

如果是因为调用了不应该被调用的方法,应该检查文档或者代码来确定哪些方法是可以被调用的,并避免调用不正确的方法。

使用例子

是的,这是一个使用不正确回调函数的示例:


import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

如果我们将`MainHandler`中的`get`方法替换为其他函数,例如`get_data(self)`,这个程序就会抛出"should not be called"的异常,因为Tornado的RequestHandler类默认只接受`get`,`post`,`put`,`delete`等方法。

这是一个调用不应该被调用的方法的示例:


import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.finish()
        # 此处finish()不应该被调用,因为它已经在RequestHandler类中被调用了

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

在这个例子中,我们在`MainHandler`的`get`方法中调用了`finish()`,但是`finish()`已经在父类的`__init__()`中被调用了,所以在这里再次调用会导致抛出"should not be called"的异常。

这两个例子只是简单的演示,在实际编码中可能会有更复杂的情况,不过原理都是一样的。