Catch-All gestor de excepciones global en App Engine para Python
-
28-09-2019 - |
Pregunta
¿Es posible crear un cajón de sastre de gestión de excepciones global en Google App Engine usando Python?
Básicamente, quiero capturar todas las excepciones de la ONU capturados y con gracia manejarlo, al enviar un correo electrónico con el rastreo a mí.
En la actualidad, para todos los errores sin capturar, los usuarios ver un StackTrace con un fragmento de código en el mismo. Esto no es deseable.
Solución
Sí, es posible.
Puede hacerlo utilizando el href="http://code.google.com/intl/it/appengine/articles/python/recording_exceptions_with_ereporter.html" rel="noreferrer"> ereporter paquete que permite recibir informes de excepción de su solicitud por correo electrónico.
Ereporter informará dos tipos de excepciones:
- excepciones registra con
logging.exception('Your handled exception')
- las excepciones no capturadas
Para capturar todas las excepciones, que crearía una clase personalizada BaseHandler anulando la handle_exception () método ; todos los controladores de solicitudes deben heredar de esta clase Base.
Echar un vistazo a las respuestas de errores personalizados también.
Aquí está un ejemplo sencillo 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', {}))
Otros consejos
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 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)
Proveedores: llamada excepto: SendEmail