Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Catch-All global exception handler in App Engine for Python

Is it possible to create a catch-all global exception handler in Google App Engine using Python?

Basically, I want to catch all un-caught exceptions and gracefully handle it, while sending an email with the traceback to me.

Currently, for all uncaught errors, the users see a stacktrace with a snippet of code in it. This is undesirable.

like image 498
Derick Avatar asked Nov 28 '10 11:11

Derick


2 Answers

Yes it is possible.
You can do it using the ereporter package that allows to receive exception reports from your application by email.

Ereporter will report two kind of exceptions:

  • exceptions logged with logging.exception('Your handled exception')
  • any uncaught exceptions

To catch all the exceptions, I would create a custom BaseHandler class overriding the handle_exception() method; all your request handlers should inherit from this Base class.
Have a look to Custom Error Responses too.

Here is a simple example of BaseHandler class:

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', {}))
like image 153
systempuntoout Avatar answered Oct 15 '22 18:10

systempuntoout


You might want to call the original handle_exception by calling the following in your BaseHandler:

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

Here it is in context.

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)
like image 38
crizCraig Avatar answered Oct 15 '22 17:10

crizCraig