2010-11-28 14 views
6

Ist es möglich, in Google App Engine mithilfe von Python einen globalen globalen Ausnahme-Handler zu erstellen?Catch-All globaler Ausnahme-Handler in App Engine für Python

Grundsätzlich möchte ich alle nicht gefangene Ausnahmen abfangen und damit elegant umgehen, während ich eine E-Mail mit dem Traceback an mich sende.

Derzeit sehen die Benutzer für alle nicht erfassten Fehler einen Stacktrace mit einem Codeschnipsel darin. Dies ist unerwünscht.

Antwort

11

Ja, es ist möglich.
Sie können dies mit dem Paket ereporter tun, das es ermöglicht, Ausnahmeberichte von Ihrer Anwendung per E-Mail zu erhalten.

Ereporter werden zwei Arten von Ausnahmen berichten:

  • protokolliert Ausnahmen mit logging.exception('Your handled exception')
  • alle abgefangene Ausnahmen

alle Ausnahmen zu fangen, würde ich eine benutzerdefinierte BaseHandler Klasse erstellen Überschreiben der handle_exception() Methode; Alle Ihre Request-Handler sollten von dieser Basisklasse erben.
Werfen Sie einen Blick auf Custom Error Responses auch.

Hier ist ein einfaches Beispiel für BaseHandler Klasse:

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! Dies scheint die Hälfte meines Problems zu lösen, aber wenn dies aktiviert ist, was sieht der Benutzer, wenn eine nicht gefangene Ausnahme auftritt? Gibt es eine Möglichkeit, den Benutzer auf eine Standardfehlerseite für alle nicht behandelten Ausnahmen umzuleiten? – Derick

+0

@Derick sehe meine Bearbeitung – systempuntoout

+0

Danke! Ich bin bei Python nicht so toll. Könnten Sie bitte ein Code-Snippet einfügen, wie Sie das für die Klasse webapp.RequestHandler tun können? Würde mich wirklich freuen. – Derick

1

Sie könnten in Ihrer BaseHandler die nach dem ursprünglichen handle_exception nennen wollen durch den Aufruf:

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

Hier ist es in Zusammenhang.

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)