2012-07-09 2 views
8

Sulla base di alcuni googling ho installato il seguente gestore degli errori. Comunque le eccezioni python che sembrano restituire un http 500 non sono intrappolate da questa roba, sebbene lo siano 404. Con le dichiarazioni di stampa che ho lasciato nel codice qui sotto, posso vedere che non ha colpito nessuna di queste routine. Cosa dovrei fare davvero?Gestire con garbo le eccezioni dell'applicazione in un'applicazione 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) 

risposta

9

Prima di tutto, l'eccezione che si stanno alzando in prepare ha codice 200, quindi non è preso nella funzione get_error_html.

In secondo luogo, get_error_html è obsoleto: utilizzare write_error, invece (write_error).

Infine, non è necessario chiamare il __init__ErrorHandler: per inizializzare utilizzare un gestore initialize (initialize), ma in questo caso non è necessario esso.

Ecco un esempio di lavoro:

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, grazie per la risposta. Dichiarando un metodo write_error() per gli hanlder sono in grado di intrappolare i 500; tuttavia questo approccio non funziona davvero per gestire gli 404 attraverso il sito! Quindi ho dovuto combinare una classe globale di gestori degli errori che ho assegnato a tornado.web.ErrorHandler, oltre a una classe base con un metodo write_error() come suggerito da voi. Ora sono in grado di catturare le eccezioni della mia applicazione, oltre agli 404 globali. – Karra

7
  1. Handlers. Consente di definire alcuni gestori predefiniti faremo di utilizzare
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. Impostazioni. Dobbiamo definire default_handler_class e default_handler_args così
settings = { 
    'default_handler_class': ErrorHandler, 
    'default_handler_args': dict(status_code=404) 
} 
  1. applicazione.
application = tornado.web.Application([ 
    (r"/", MainHandler) 
], **settings) 

come risultato. tutti gli errori tranne 404 saranno gestiti da BaseHandler. 404 - ErrorHandler. è tutto :)

-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

Si prega di aggiungere un contesto, una spiegazione o qualsiasi commento pertinente al posto del solo codice senza contesto. – Sebastialonso