summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Merickel <michael@merickel.org>2017-06-15 01:12:10 -0500
committerMichael Merickel <michael@merickel.org>2017-06-15 01:13:10 -0500
commit6f2f04a4d2d1df1b5fd7d5327c57e96e059279cd (patch)
tree89bb9a6a4cd19d0dcd7f70c5c9150a9f698fa7e9
parent975b025c7952d148392cc17b48388a4ee5dcbd45 (diff)
downloadpyramid-6f2f04a4d2d1df1b5fd7d5327c57e96e059279cd.tar.gz
pyramid-6f2f04a4d2d1df1b5fd7d5327c57e96e059279cd.tar.bz2
pyramid-6f2f04a4d2d1df1b5fd7d5327c57e96e059279cd.zip
add a reraise argument to request.invoke_exception_view
-rw-r--r--pyramid/tests/test_view.py27
-rw-r--r--pyramid/view.py26
2 files changed, 44 insertions, 9 deletions
diff --git a/pyramid/tests/test_view.py b/pyramid/tests/test_view.py
index a9ce2234d..e03487a70 100644
--- a/pyramid/tests/test_view.py
+++ b/pyramid/tests/test_view.py
@@ -886,6 +886,18 @@ class TestViewMethodsMixin(unittest.TestCase):
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 @@ class TestViewMethodsMixin(unittest.TestCase):
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']
diff --git a/pyramid/view.py b/pyramid/view.py
index 14d11825e..dc4aae3fa 100644
--- a/pyramid/view.py
+++ b/pyramid/view.py
@@ -16,6 +16,7 @@ from pyramid.interfaces import (
)
from pyramid.compat import decode_path_info
+from pyramid.compat import reraise as reraise_
from pyramid.exceptions import (
ConfigurationError,
@@ -630,8 +631,9 @@ class ViewMethodsMixin(object):
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 @@ class ViewMethodsMixin(object):
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
@@ -675,6 +675,8 @@ class ViewMethodsMixin(object):
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:
request = self
@@ -716,10 +718,16 @@ class ViewMethodsMixin(object):
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