2012-07-09 33 views
8

Dựa trên một số googling tôi đã cài đặt trình xử lý lỗi sau. Tuy nhiên, các ngoại lệ trăn xuất hiện để trả lại một http 500 không bị mắc kẹt bởi công cụ này, mặc dù 404 là. Với các câu lệnh in mà tôi đã để lại trong đoạn mã dưới đây, tôi có thể thấy rằng nó không ảnh hưởng đến bất kỳ thói quen nào. Tôi nên làm gì đây?Duyên dáng xử lý ngoại lệ ứng dụng trong ứng dụng 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) 

Trả lời

9

Trước hết, ngoại trừ rằng bạn đang làm dấy lên trong prepare có mã 200, do đó nó không bị bắt trong các get_error_html chức năng.

Thứ hai, get_error_html không được dùng nữa: sử dụng write_error, thay vào đó (write_error).

Cuối cùng, bạn không cần gọi số __init__ trên ErrorHandler: để khởi tạo trình xử lý initialize (initialize), nhưng trong trường hợp này bạn không cần đến.

Dưới đây là một ví dụ làm việc:

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() 
+0

Iboola, cảm ơn bạn đã phản hồi. Bằng cách khai báo phương thức write_error() cho hanlders, tôi có thể bẫy 500s; tuy nhiên phương pháp này không thực sự hoạt động để xử lý các 404 trên trang web! Vì vậy, tôi đã phải kết hợp một lớp xử lý lỗi toàn cục mà tôi đã gán cho tornado.web.ErrorHandler, ngoài lớp cơ sở với phương thức write_error() như bạn đã đề xuất. Bây giờ tôi có thể bắt ngoại lệ ứng dụng của tôi, ngoài các 404 toàn cầu. – Karra

7
  1. Handlers. Cho phép xác định một số xử lý mặc định chúng ta sẽ sử dụng
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. Settings. Chúng ta cần phải xác định default_handler_classdefault_handler_args cũng
settings = { 
    'default_handler_class': ErrorHandler, 
    'default_handler_args': dict(status_code=404) 
} 
  1. Application.
application = tornado.web.Application([ 
    (r"/", MainHandler) 
], **settings) 

là kết quả. tất cả các lỗi ngoại trừ 404 sẽ được xử lý bởi BaseHandler. 404 - ErrorHandler. đó là nó :)

-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) 
+0

Vui lòng thêm một số ngữ cảnh, giải thích hoặc bất kỳ nhận xét thích hợp nào thay vì chỉ là mã không có ngữ cảnh. – Sebastialonso

Các vấn đề liên quan