def handle_error_nicely(self, request): """Try to provide some nice error handling. """ try: # nice error messages tb_1 = traceback.format_exc() response = sys.exc_info()[1] if not isinstance(response, Response): aspen.log_dammit(tb_1) response = Response(500, tb_1) elif 200 <= response.code < 300: return response response.request = request self.hooks.outbound_early.run(response) fs = self.ours_or_theirs(str(response.code) + '.html') if fs is None: fs = self.ours_or_theirs('error.html') if fs is None: raise request.fs = fs request.original_resource = request.resource request.resource = resources.get(request) response = request.resource.respond(request, response) return response except Response, response: # no nice error simplate available raise
def handle_error_nicely(self, tb_1, request): response = sys.exc_info()[1] if not isinstance(response, Response): # We have a true Exception; convert it to a Response object. response = Response(500, tb_1) response.request = request if 200 <= response.code < 300: # The app raised a Response(2xx). Act as if nothing # happened. This is unusual but allowed. pass else: # Delegate to any error simplate. # =============================== fs = self.ours_or_theirs(str(response.code) + '.html') if fs is None: fs = self.ours_or_theirs('error.html') if fs is not None: request.fs = fs request.original_resource = request.resource request.resource = resources.get(request) response = request.resource.respond(request, response) return response
def handle_error_nicely(self, tb_1, request): response = sys.exc_info()[1] if not isinstance(response, Response): # We have a true Exception; convert it to a Response object. response = Response(500, tb_1) response.request = request if 500 <= response.code < 600: # Log tracebacks for Reponse(5xx). aspen.log_dammit(tb_1) # TODO Switch to the logging module and use something like this: # log_level = [DEBUG,INFO,WARNING,ERROR][(response.code/100)-2] # logging.log(log_level, tb_1) if 200 <= response.code < 300 or response.code == 304: # The app raised a Response(2xx) or Response(304). # Act as if nothing happened. This is unusual but allowed. pass else: # Delegate to any error simplate. # =============================== rc = str(response.code) possibles = [ rc + ".html", rc + ".html.spt", "error.html", "error.html.spt" ] fs = first( self.ours_or_theirs(errpage) for errpage in possibles ) if fs is not None: request.fs = fs request.original_resource = request.resource request.resource = resources.get(request) response = request.resource.respond(request, response) return response
def handle_error_nicely(self, request): """Try to provide some nice error handling. """ try: # nice error messages tb_1 = traceback.format_exc() response = sys.exc_info()[1] if not isinstance(response, Response): log.error(tb_1) response = Response(500, tb_1) response.request = request self.hooks.run('outbound_early', response) fs = self.ours_or_theirs(str(response.code) + '.html') if fs is None: fs = self.ours_or_theirs('error.html') if fs is None: raise request.fs = fs response = simplates.handle(request, response) except Response, response: # no nice error template available raise
request.fs = fs request.original_resource = request.resource request.resource = resources.get(request) response = request.resource.respond(request, response) return response except Response, response: # no nice error simplate available raise except: # last chance for tracebacks in the browser tb_2 = traceback.format_exc().strip() tbs = '\n\n'.join([tb_2, "... while handling ...", tb_1]) aspen.log_dammit(tbs) if self.show_tracebacks: response = Response(500, tbs) else: response = Response(500) response.request = request raise response def find_ours(self, filename): """Given a filename, return a filepath. """ return join(os.path.dirname(__file__), 'www', filename) def ours_or_theirs(self, filename): """Given a filename, return a filepath or None. """ if self.project_root is not None: theirs = join(self.project_root, filename) if isfile(theirs): return theirs