13

いくつかのグーグルに基づいて、次のエラーハンドラをインストールしました。ただし、http 500を返すように見えるPython例外は、404はトラップされますが、このようなものによってトラップされません。以下のコードに残したprintステートメントを使用すると、これらのルーチンのいずれにもヒットしないことがわかります。私は本当に何をすべきですか?

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)
4

3 に答える 3

15

まず、発生させている例外にprepareは code200があるため、関数にキャッチされませんget_error_html

次に、get_error_html非推奨です:write_error代わりに ( write_error ) を使用してください。

__init__最後に、 on :を呼び出して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()
于 2012-07-09T15:46:28.840 に答える
-1
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)
于 2016-04-05T08:11:59.087 に答える