diff --git a/glance/common/wsgi.py b/glance/common/wsgi.py index 53f179762e..b71f765468 100644 --- a/glance/common/wsgi.py +++ b/glance/common/wsgi.py @@ -882,6 +882,10 @@ class Resource(object): except webob.exc.WSGIHTTPException as e: exc_info = sys.exc_info() six.reraise(translate_exception(request, e), None, exc_info[2]) + except Exception as e: + LOG.exception(_LE("Caught error: %s"), six.text_type(e)) + response = webob.exc.HTTPInternalServerError() + return response try: response = webob.Response(request=request) diff --git a/glance/tests/unit/common/test_wsgi.py b/glance/tests/unit/common/test_wsgi.py index baa0628252..9ef382261b 100644 --- a/glance/tests/unit/common/test_wsgi.py +++ b/glance/tests/unit/common/test_wsgi.py @@ -317,6 +317,25 @@ class ResourceTest(test_utils.BaseTestCase): self.assertIsInstance(response, webob.exc.HTTPForbidden) self.assertEqual(403, response.status_code) + def test_call_raises_exception(self): + class FakeController(object): + def index(self, shirt, pants=None): + return (shirt, pants) + + resource = wsgi.Resource(FakeController(), None, None) + + def dispatch(self, obj, action, *args, **kwargs): + raise Exception("test exception") + + self.stubs.Set(wsgi.Resource, 'dispatch', dispatch) + + request = wsgi.Request.blank('/') + + response = resource.__call__(request) + + self.assertIsInstance(response, webob.exc.HTTPInternalServerError) + self.assertEqual(500, response.status_code) + @mock.patch.object(wsgi, 'translate_exception') def test_resource_call_error_handle_localized(self, mock_translate_exception):