2010-11-28 4 views
6

Est-il possible de créer un gestionnaire d'exceptions global dans Google App Engine en utilisant Python?Catch: gestionnaire d'exception global dans App Engine pour Python

Fondamentalement, je veux attraper toutes les exceptions non-saisies et le manipuler gracieusement, tout en m'envoyant un email avec la traceback.

Actuellement, pour toutes les erreurs non interceptées, les utilisateurs voient une pile avec un extrait de code. Ceci est indésirable.

Répondre

11

Oui, il est possible.
Vous pouvez le faire en utilisant le package ereporter qui permet de recevoir des rapports d'exception de votre application par courrier électronique.

Ereporter rapportera deux types d'exceptions:

  • exceptions enregistrées avec logging.exception('Your handled exception')
  • des exceptions non rattrapées

Pour attraper toutes les exceptions, je créerais une classe BaseHandler personnalisée remplaçant la handle_exception() méthode; tous vos gestionnaires de requêtes doivent hériter de cette classe de base. Regardez aussi Custom Error Responses.

Voici un exemple simple de classe 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

Awesome! Cela semble résoudre la moitié de mon problème, mais lorsque cela est activé, que verra l'utilisateur lorsqu'une exception non interceptée se produit? Est-il possible de rediriger l'utilisateur vers une page d'erreur par défaut pour toutes les exceptions non gérées? – Derick

+0

@Derick voir mon édition – systempuntoout

+0

Merci! Je ne suis pas très bon à python, pourriez-vous s'il vous plaît inclure un extrait de code sur la façon de le faire pour la classe webapp.RequestHandler? J'apprécierais vraiment. – Derick

1

Vous pouvez appeler le handle_exception d'origine en appelant ce qui suit dans votre BaseHandler:

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

Ici, il est dans le contexte.

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) 
Questions connexes