diff --git a/pecan/routing.py b/pecan/routing.py index 90a9126..9b2f57b 100644 --- a/pecan/routing.py +++ b/pecan/routing.py @@ -173,15 +173,16 @@ def lookup_controller(obj, remainder, request=None): def handle_lookup_traversal(obj, args): try: result = obj(*args) + except TypeError as te: + logger.debug('Got exception calling lookup(): %s (%s)', + te, te.args) + else: if result: prev_obj = obj obj, remainder = result # crossing controller boundary cross_boundary(prev_obj, obj) return result - except TypeError as te: - logger.debug('Got exception calling lookup(): %s (%s)', - te, te.args) def find_object(obj, remainder, notfound_handlers, request): diff --git a/pecan/tests/test_base.py b/pecan/tests/test_base.py index 847c757..0969755 100644 --- a/pecan/tests/test_base.py +++ b/pecan/tests/test_base.py @@ -343,6 +343,17 @@ class TestLookups(PecanTestCase): r = app.get('/foo/bar', expect_errors=True) assert r.status_int == 404 + def test_lookup_with_wrong_return(self): + class RootController(object): + @expose() + def _lookup(self, someID, *remainder): + return 1 + + app = TestApp(Pecan(RootController())) + self.assertRaises(TypeError, + app.get, + '/foo/bar', expect_errors=True) + class TestCanonicalLookups(PecanTestCase):