2010-11-28 14 views
6

¿Es posible crear un controlador global de excepciones catch-all en Google App Engine utilizando Python?Controlador global de excepciones Catch-All en App Engine para Python

Básicamente, quiero capturar todas las excepciones no detectadas y manejarlas con elegancia, mientras me envía un correo electrónico con el rastreo.

Actualmente, para todos los errores no detectados, los usuarios ven un stacktrace con un fragmento de código en él. Esto es indeseable

Respuesta

11

Sí, es posible.
Puede hacerlo utilizando el paquete ereporter que le permite recibir informes de excepción de su aplicación por correo electrónico.

Ereporter informará dos tipos de excepciones:

  • excepciones registradas con logging.exception('Your handled exception')
  • las excepciones no capturadas

Para coger todas las excepciones, me gustaría crear una clase BaseHandler encargo anulando el handle_exception() método; todos sus manejadores de solicitudes deben heredar de esta clase Base.
Echa un vistazo al Custom Error Responses también.

Aquí es un simple ejemplo de la clase BaseHandler:

class BaseHandler(webapp.RequestHandler): 

    def handle_exception(self, exception, debug_mode): 
     if debug_mode: 
      webapp.RequestHandler.handle_exception(self, exception, debug_mode) 
     else: 
      logging.exception(exception) 
      self.error(500) 
      self.response.out.write(template.render('templdir/error.html', {})) 
+0

¡Impresionante! Esto parece resolver la mitad de mi problema, pero cuando esto está habilitado, ¿qué verá el usuario cuando ocurra una excepción no detectada? ¿Hay alguna manera de redirigir al usuario a una página de error predeterminada para todas las excepciones no controladas? – Derick

+0

@Derick ver mi edición – systempuntoout

+0

¡Gracias! No soy tan bueno en Python, ¿podrías incluir un fragmento de código sobre cómo hacer esto para la clase webapp.RequestHandler? Realmente lo apreciaría – Derick

1

Es posible que desee llamar a la handle_exception original, llamando al siguiente en su BaseHandler:

webapp.RequestHandler.handle_exception(self, exception, debug_mode) 

aquí está en su contexto.

from google.appengine.ext import webapp 
import sys 
import traceback 

class BaseHandler(webapp.RequestHandler): 
    def handle_exception(self, exception, debug_mode): 
     from main import emaildevs 
     emaildevs('An error occurred on example.com', ''.join(traceback.format_exception(*sys.exc_info()))) 
     webapp.RequestHandler.handle_exception(self, exception, debug_mode) 
Cuestiones relacionadas