在Tornado应用程序中优雅地处理应用程序异常
问题描述:
基于一些Google搜索,我安装了以下错误处理程序。然而,似乎返回一个http 500的python异常不会被这个东西困住,虽然404是。通过下面的代码留下的打印声明,我可以看到它没有遇到任何这些例程。我应该怎么做?在Tornado应用程序中优雅地处理应用程序异常
class ErrorHandler(tornado.web.RequestHandler):
"""Generates an error response with status_code for all requests."""
def __init__ (self, application, request, status_code):
print 'In ErrorHandler init'
tornado.web.RequestHandler.__init__(self, application, request)
self.set_status(status_code)
def get_error_html (self, status_code, **kwargs):
print 'In get_error_html. status_code: ', status_code
if status_code in [403, 404, 500, 503]:
filename = '%d.html' % status_code
print 'rendering filename: ', filename
return self.render_string(filename, title=config.get_title())
return "<html><title>%(code)d: %(message)s</title>" \
"<body class='bodyErrorPage'>%(code)d: %(message)s</body>"\
"</html>" % {
"code": status_code,
"message": httplib.responses[status_code],
}
def prepare (self):
print 'In prepare...'
raise tornado.web.HTTPError(self._status_code)
答
首先,你是在养有prepare
代码200
异常,因此它不是在get_error_html
功能捕获。
其次,get_error_html
已弃用:使用write_error
,而不是(write_error)。
最后,你不需要调用__init__
上ErrorHandler
:初始化函数使用initialize
(initialize),但在这种情况下,你不需要它。
这里是一个工作示例:
import tornado
import tornado.web
class ErrorHandler(tornado.web.RequestHandler):
"""Generates an error response with status_code for all requests."""
def write_error(self, status_code, **kwargs):
print 'In get_error_html. status_code: ', status_code
if status_code in [403, 404, 500, 503]:
self.write('Error %s' % status_code)
else:
self.write('BOOM!')
def prepare(self):
print 'In prepare...'
raise Exception('Error!')
application = tornado.web.Application([
(r"/", ErrorHandler),
])
if __name__ == "__main__":
application.listen(8899)
tornado.ioloop.IOLoop.instance().start()
答
- 处理程序。让我们定义一些默认处理程序我们会使用
import tornado.web
class BaseHandler(tornado.web.RequestHandler):
"""
Base handler gonna to be used instead of RequestHandler
"""
def write_error(self, status_code, **kwargs):
if status_code in [403, 404, 500, 503]:
self.write('Error %s' % status_code)
else:
self.write('BOOM!')
class ErrorHandler(tornado.web.ErrorHandler, BaseHandler):
"""
Default handler gonna to be used in case of 404 error
"""
pass
class MainHandler(BaseHandler):
"""
Main handler
"""
def get(self):
self.write('Hello world!')
- 设置。我们需要定义
default_handler_class
和default_handler_args
以及 - 应用。
settings = {
'default_handler_class': ErrorHandler,
'default_handler_args': dict(status_code=404)
}
application = tornado.web.Application([
(r"/", MainHandler)
], **settings)
作为结果。所有错误,除了404将由BaseHandler处理。 404 - ErrorHandler。就是这样:)
答
import tornado.web
class BaseHandler(tornado.web.RequestHandler):
def write_error(self, status_code, **kwargs):
print status_code
super(BaseHandler, self).write_error(status_code, **kwargs)
+0
请添加一些上下文,解释或任何相关的评论,而不是仅仅是无环境的代码。 – Sebastialonso 2017-01-16 14:08:38
Iboola,谢谢你的回应。通过为hanlders声明一个write_error()方法,我可以捕获500个数据;但是,这种方法并不适用于处理整个网站的404! 所以我不得不把我分配给tornado.web.ErrorHandler的一个全局错误处理程序类,除了一个基类和你所建议的write_error()方法。现在我能够捕获我的应用程序异常,除了全局404s。 – Karra 2012-07-10 05:44:47