Michael Merickel
2017-06-15 2ea943e690d8f09d07c13ca4d513cfafbfba33f1
Merge pull request #3085 from mmerickel/reraise-invoke-exception-view

add a reraise argument to request.invoke_exception_view
2 files modified
53 ■■■■ changed files
pyramid/tests/test_view.py 27 ●●●●● patch | view | raw | blame | history
pyramid/view.py 26 ●●●●● patch | view | raw | blame | history
pyramid/tests/test_view.py
@@ -886,6 +886,18 @@
        else: # pragma: no cover
            self.fail()
    def test_it_reraises_if_not_found(self):
        request = self._makeOne()
        dummy_exc = RuntimeError()
        try:
            raise dummy_exc
        except RuntimeError:
            self.assertRaises(
                RuntimeError,
                lambda: request.invoke_exception_view(reraise=True))
        else: # pragma: no cover
            self.fail()
    def test_it_raises_predicate_mismatch(self):
        from pyramid.exceptions import PredicateMismatch
        def exc_view(exc, request): pass
@@ -900,6 +912,21 @@
        else: # pragma: no cover
            self.fail()
    def test_it_reraises_after_predicate_mismatch(self):
        def exc_view(exc, request): pass
        self.config.add_view(exc_view, context=Exception, request_method='POST')
        request = self._makeOne()
        request.method = 'GET'
        dummy_exc = RuntimeError()
        try:
            raise dummy_exc
        except RuntimeError:
            self.assertRaises(
                RuntimeError,
                lambda: request.invoke_exception_view(reraise=True))
        else: # pragma: no cover
            self.fail()
class ExceptionResponse(Exception):
    status = '404 Not Found'
    app_iter = ['Not Found']
pyramid/view.py
@@ -16,6 +16,7 @@
    )
from pyramid.compat import decode_path_info
from pyramid.compat import reraise as reraise_
from pyramid.exceptions import (
    ConfigurationError,
@@ -630,8 +631,9 @@
        self,
        exc_info=None,
        request=None,
        secure=True
        ):
        secure=True,
        reraise=False,
    ):
        """ Executes an exception view related to the request it's called upon.
        The arguments it takes are these:
@@ -654,14 +656,12 @@
            does not have the appropriate permission, this should be ``True``.
            Default: ``True``.
        If called with no arguments, it uses the global exception information
        returned by ``sys.exc_info()`` as ``exc_info``, the request
        object that this method is attached to as the ``request``, and
        ``True`` for ``secure``.
        ``reraise``
        This method returns a :term:`response` object or raises
        :class:`pyramid.httpexceptions.HTTPNotFound` if a matching view cannot
        be found.
            A boolean indicating whether the original error should be reraised
            if a :term:`response` object could not be created. If ``False``
            then an :class:`pyramid.httpexceptions.HTTPNotFound`` exception
            will be raised. Default: ``False``.
        If a response is generated then ``request.exception`` and
        ``request.exc_info`` will be left at the values used to render the
@@ -674,6 +674,8 @@
           The ``request.exception`` and ``request.exc_info`` properties will
           reflect the exception used to render the response where previously
           they were reset to the values prior to invoking the method.
           Also added the ``reraise`` argument.
        """
        if request is None:
@@ -716,10 +718,16 @@
                    secure=secure,
                    request_iface=request_iface.combined,
                    )
            except:
                if reraise:
                    reraise_(*exc_info)
                raise
            finally:
                manager.pop()
        if response is None:
            if reraise:
                reraise_(*exc_info)
            raise HTTPNotFound
        # successful response, overwrite exception/exc_info