2012-07-09 10 views
8

Basado en Google, instalé el siguiente controlador de errores. Sin embargo, las excepciones de Python que parecen devolver un http 500 no quedan atrapadas por este material, aunque sí lo son los 404. Con las declaraciones de impresión que he dejado en el código a continuación, puedo ver que no coincide con ninguna de estas rutinas. ¿Qué debería estar haciendo realmente?Manejo elegante de excepciones de aplicaciones en una aplicación 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) 

Respuesta

9

En primer lugar, la excepción de que se está criando en prepare tiene código 200, por lo tanto no está atrapado en la función get_error_html.

En segundo lugar, get_error_html está en desuso: utilice write_error, en su lugar (write_error).

Por último, no es necesario llamar a __init__ en ErrorHandler: inicializar un controlador de utilizar initialize (initialize), pero en este caso no lo necesita.

Aquí es un ejemplo de trabajo:

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, gracias por la respuesta. Al declarar un método write_error() para los ladrones, puedo atrapar los 500; Sin embargo, este enfoque no funciona para manejar los 404 en todo el sitio. Así que tuve que combinar una clase de manejador de error global que asigné a tornado.web.ErrorHandler, además de una clase base con un método write_error() como usted sugirió. Ahora puedo detectar las excepciones de mi aplicación, además de los 404 globales. – Karra

7
  1. los manipuladores. Vamos a definir algunos controladores predeterminados que va a utilizar
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. Configuración. Tenemos que definir default_handler_class y default_handler_args así
settings = { 
    'default_handler_class': ErrorHandler, 
    'default_handler_args': dict(status_code=404) 
} 
  1. aplicación.
application = tornado.web.Application([ 
    (r"/", MainHandler) 
], **settings) 

como resultado. todos los errores excepto 404 serán manejados por BaseHandler. 404 - ErrorHandler. eso es todo :)

-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

Agregue contexto, explicación o cualquier comentario relevante en lugar de solo el código sin contexto. – Sebastialonso