diff --git a/src/rouse/web/__init__.py b/src/rouse/web/__init__.py index f683a9a..84d2c6f 100644 --- a/src/rouse/web/__init__.py +++ b/src/rouse/web/__init__.py @@ -4,8 +4,13 @@ from milla.dispatch import routing import functools import jinja2 import json +import logging import milla.util import os +import sys + + +log = logging.getLogger(__name__) class SmartJSONEncoder(json.JSONEncoder): @@ -58,6 +63,8 @@ class VariedResponse(milla.Response): class Application(milla.Application): + ERROR_TMPL = None + def __init__(self, config=None): # pylint: disable=super-init-not-called self.config = {} if config and os.path.exists(config): @@ -93,3 +100,20 @@ class Application(milla.Application): request.want = 'xhtml' request.ResponseClass = VariedResponse.for_request(request) return request + + def handle_error(self, request): + response = request.ResponseClass() + e = sys.exc_info()[1] + context = {} + if isinstance(e, milla.HTTPRedirection): + return e + elif isinstance(e, milla.WSGIHTTPException): + log.debug('{}'.format(e)) + response.status_int = e.code + context['error'] = '{}'.format(e) + else: + log.exception('An unhandled exception occurred:') + response.status_int = 500 + context['error'] = 'An unknown error has occurred' + response.set_payload(self.ERROR_TMPL, context) + return response