在Tornado框架中,捕获和处理404错误(即未找到页面错误)可以通过定义一个全局的错误处理函数来实现。这个函数会被Tornado自动调用,当请求的资源不存在时。下面是一个简单的示例,展示了如何在Tornado应用中捕获和处理404错误。
首先,你需要在你的Tornado应用类中定义一个`write_error`方法。这个方法会捕获所有未被处理的异常,包括404错误。为了区分不同类型的错误,你可以检查`self._status_code`属性,它会被设置为HTTP状态码。
import tornado.ioloop
import tornado.web
class BaseHandler(tornado.web.RequestHandler):
pass
class MainHandler(BaseHandler):
def get(self):
self.write("Hello, world")
class ErrorHandler(BaseHandler):
def write_error(self, status_code, **kwargs):
if status_code == 404:
self.write("404 Error: Not Found")
self.set_status(404)
else:
self.write(f"{status_code} Error")
self.set_status(status_code)
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
(r".*", ErrorHandler), # 使用通配符捕获所有未匹配到的路由
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
在这个例子中,`ErrorHandler`类继承自`BaseHandler`(它本身继承自`tornado.web.RequestHandler`),并重写了`write_error`方法。我们设置了一个通配符路由`(.*)`来捕获所有未被前面路由规则匹配到的请求,并将这些请求交给`ErrorHandler`处理。在`write_error`方法中,我们首先检查状态码是否为404,如果是,则返回“404 Error: Not Found”消息,并设置HTTP状态码为404。对于其他类型的错误,我们也返回相应的错误消息和状态码。
请注意,在这个例子中,我们将`ErrorHandler`作为捕获所有未匹配路由的处理器,这实际上是一种简化的处理方式。在实际应用中,你可能希望根据具体情况来定义更细粒度的错误处理逻辑,或者将错误处理逻辑分散到不同的处理器中。但是,无论采用哪种方式,核心思想都是通过重写`write_error`方法来实现对404错误的捕获和处理。