def _translate_result(self, rslt, err, id_): if err != None: if isinstance(err, CustomJsException): return err.message log = self._log_errors() if log: return log err = {"name": err.__class__.__name__, "message": err.message} rslt = None try: if isinstance(rslt, basestring): data = '{"result":%s,"id":%i,"error":%s}' % (rslt, id_, dumps(err)) else: data = dumps({"result": rslt, "id": id_, "error": err}) except JSONEncodeException, e: err = {"name": "JSONEncodeException", "message": "Result Object Not Serializable"} data = dumps({"result": None, "id": id_, "error": err})
def _log_errors(self): """ In development env, it will logs the error to the browser's console as well as the logs file. otherwise, it will only be logged in the log files (appengine app console) """ import traceback, sys exc_type, exc_value, exc_tb = sys.exc_info() tb = traceback.format_exception(exc_type, exc_value, exc_tb) err = "".join(tb) logging.error(err) if "Development" in os.environ["SERVER_SOFTWARE"]: return "console.warn(%s)" % dumps("Python Error:\n%s" % err)
def dispatch_request(environ, start_response): """Main entry point for the Trac web interface. @param environ: the WSGI environment dict @param start_response: the WSGI callback for starting the response """ try: env = Environment() req = Request(environ, start_response) try: dispatcher = RequestDispatcher(env) dispatcher.dispatch(req) except RequestDone: pass resp = req._response or [] return resp except Exception, ex: req = Request(environ, start_response) from google.appengine.ext.webapp import template from tic.web import browser req.send_response(500) mimetype = "text/html;charset=utf-8" req.send_header('Content-Type', mimetype) import traceback, sys exc_type, exc_value, exc_tb = sys.exc_info() tb = traceback.format_exception(exc_type, exc_value, exc_tb) err = ''.join(tb) logging.error('\n' + err) if 'Development' in os.environ['SERVER_SOFTWARE']: error = "function(){console.warn(%s);}()" % dumps("Python Error:\n%s" % err) vars = { 'data': { 'js': error, 'text': '<br />'.join(tb) } } req.write(template.render("tic/web/templates/error.html", vars)) else: raise