import sys from pyramid.compat import reraise from pyramid.httpexceptions import HTTPNotFound def _error_handler(request, exc): # NOTE: we do not need to delete exc_info because this function # should never be in the call stack of the exception exc_info = sys.exc_info() try: response = request.invoke_exception_view(exc_info) except HTTPNotFound: # re-raise the original exception as no exception views were # able to handle the error reraise(*exc_info) return response def excview_tween_factory(handler, registry): """ A :term:`tween` factory which produces a tween that catches an exception raised by downstream tweens (or the main Pyramid request handler) and, if possible, converts it into a Response using an :term:`exception view`.""" def excview_tween(request): try: response = handler(request) except Exception as exc: response = _error_handler(request, exc) return response return excview_tween MAIN = 'MAIN' INGRESS = 'INGRESS' EXCVIEW = 'pyramid.tweens.excview_tween_factory'