Tornado的错误处理

2016/05/12 网站开发

Tornado非常好用轻巧。最近一直在用它做一个API服务网站。既然是提供服务的网站, 错误处理就很重要了。

这里说的错误,主要有两方面,一个是url错误,404没有发现对应的网页;另外一个是在处理Request时发现错误,需要给用户返回错误信息。

URL错误

这部分是在url处理器没有发现对应的RequestHanlder时引发的。主要是需要在Application的Setting中增加缺省Handler就可以了。其实 Tornado已经自带一个不错的错误处理器。但是考虑到这是个提供API服务的网站,就需要特殊 处理下,返回JSON。

default_handler_class=NotFoundHandler,
default_handler_args=dict(status_code=404)
class NotFoundHandler(tornado.web.ErrorHandler):
    """
        Default handler gonna to be used in case of 404 error
    """
    """Generates an error response with ``status_code`` for all requests."""
    def initialize(self, status_code):
        self.set_status(status_code)

    def write_error(self, status_code, **kwargs):
        self.set_header('Content-Type', 'text/json')
        self.finish(json.dumps({
            'error': {
                'code': status_code,
                'message': self._reason,
            }
        }))

Request错误处理

这里的错误是指在RequestHandler的方法中出错之后的的处理。主要是需要写一个write_error函数。在这里函数里,需要区分Debug模式是否打开。

    def write_error(self, status_code, **kwargs):
        self.set_header('Content-Type', 'text/json')
        if self.settings.get("serve_traceback") and "exc_info" in kwargs:
            # in debug mode, try to send a traceback
            lines = []
            for line in traceback.format_exception(*kwargs["exc_info"]):
                lines.append(line)
            self.finish(json.dumps({
                'error': {
                    'code': status_code,
                    'message': self._reason,
                    'traceback': lines,
                }
            }))
        else:
            self.finish(json.dumps({
                'error': {
                    'code': status_code,
                    'message': self._reason,
                }
            }))

Search

    Table of Contents