适当地处理龙卷风应用程序异常(Gracefully handling application exc

2019-07-30 07:34发布

基于一些谷歌上搜索我安装了下列错误处理程序。 然而蟒蛇例外,似乎返回一个HTTP 500不被这种东西,虽然404的是。 随着我已经离开在下面的代码打印语句,我可以看到,它没有击中任何这些例程。 我应该真的会做什么?

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)

Answer 1:

首先,你是在提高除prepare有码200 ,因此它不是在抓get_error_html功能。

其次, get_error_html被弃用:使用write_error ,而不是( write_error )。

最后,你不需要调用__init__ErrorHandler :初始化处理程序使用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()


Answer 2:

  1. 处理程序。 让我们确定我们该怎么使用一些默认的处理程序
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!')
  1. 设置。 我们需要定义default_handler_classdefault_handler_args以及
settings = {
    'default_handler_class': ErrorHandler,
    'default_handler_args': dict(status_code=404)
}
  1. 应用。
application = tornado.web.Application([
    (r"/", MainHandler)
], **settings)

结果。 除了404会所有的错误由BaseHandler处理。 404 - 的ErrorHandler。 而已 :)



Answer 3:

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)


文章来源: Gracefully handling application exceptions in a Tornado application
标签: tornado