diff --git a/odinweb/containers.py b/odinweb/containers.py
index 43622c4..975da81 100644
--- a/odinweb/containers.py
+++ b/odinweb/containers.py
@@ -274,6 +274,17 @@ class ApiInterfaceBase(ApiContainer):
         """
         Handle an *un-handled* exception.
         """
+        # Let middleware attempt to handle exception
+        try:
+            for middleware in self.middleware.handle_500:
+                resource = middleware(request, exception)
+                if resource:
+                    return resource
+
+        except Exception as ex:  # noqa - This is a top level handler
+            exception = ex
+
+        # Fallback to generic error
         logger.exception('Internal Server Error: %s', exception, extra={
             'status_code': 500,
             'request': request
@@ -343,7 +354,12 @@ class ApiInterfaceBase(ApiContainer):
                 # error processing, this often provides convenience features
                 # to aid in the debugging process.
                 raise
-            resource = self.handle_500(request, e)
+
+            resource = None
+            # Fallback to the default handler
+            if resource is None:
+                resource = self.handle_500(request, e)
+
             status = resource.status
 
         if isinstance(status, HTTPStatus):
diff --git a/odinweb/data_structures.py b/odinweb/data_structures.py
index cd79032..3ec6db0 100644
--- a/odinweb/data_structures.py
+++ b/odinweb/data_structures.py
@@ -439,6 +439,14 @@ class MiddlewareList(list):
         middleware = sort_by_priority(self, reverse=True)
         return tuple(m.post_dispatch for m in middleware if hasattr(m, 'post_dispatch'))
 
+    @lazy_property
+    def handle_500(self):
+        """
+        List of handle-error methods from registered middleware.
+        """
+        middleware = sort_by_priority(self, reverse=True)
+        return tuple(m.handle_500 for m in middleware if hasattr(m, 'handle_500'))
+
     @lazy_property
     def post_swagger(self):
         """

diff --git a/tests/test_containers.py b/tests/test_containers.py
index 475acd4..0be6c61 100644
--- a/tests/test_containers.py
+++ b/tests/test_containers.py
@@ -1,6 +1,7 @@
 from __future__ import absolute_import
 
 import pytest
+from odinweb.resources import Error
 
 from odin.exceptions import ValidationError
 from odinweb import api
@@ -302,6 +303,37 @@ class TestApiInterfaceBase(object):
         with pytest.raises(ValueError):
             target.dispatch(operation, MockRequest())
 
+    def test_dispatch__error_handled_by_middleware(self):
+        class ErrorMiddleware(object):
+            def handle_500(self, request, exception):
+                assert isinstance(exception, ValueError)
+                return Error.from_status(HTTPStatus.SEE_OTHER, 0,
+                                         "Quick over there...")
+
+        def callback(request):
+            raise ValueError()
+
+        target = containers.ApiInterfaceBase(middleware=[ErrorMiddleware()])
+        operation = Operation(callback)
+
+        actual = target.dispatch(operation, MockRequest())
+        assert actual.status == 303
+
+    def test_dispatch__error_handled_by_middleware_raises_exception(self):
+        class ErrorMiddleware(object):
+            def handle_500(self, request, exception):
+                assert isinstance(exception, ValueError)
+                raise ValueError
+
+        def callback(request):
+            raise ValueError()
+
+        target = containers.ApiInterfaceBase(middleware=[ErrorMiddleware()])
+        operation = Operation(callback)
+
+        actual = target.dispatch(operation, MockRequest())
+        assert actual.status == 500
+
     def test_dispatch__encode_error_with_debug_enabled(self):
         def callback(request):
             raise api.ImmediateHttpResponse(ValueError, HTTPStatus.NOT_MODIFIED, {})

Added error hook for middleware
Allow middleware to catch errors.
Returning an explicit `True` indicates that the exception has been handled
tests/test_containers.py::TestApiInterfaceBase::test_dispatch__error_handled_by_middleware
tests/test_containers.py::TestResourceApiMeta::test_empty_api tests/test_containers.py::TestResourceApiMeta::test_normal_api tests/test_containers.py::TestResourceApiMeta::test_sub_classed_api tests/test_containers.py::TestResourceApi::test_api_name__default tests/test_containers.py::TestResourceApi::test_api_name__custom tests/test_containers.py::TestResourceApi::test_op_paths tests/test_containers.py::TestApiContainer::test_options[options0-name-None] tests/test_containers.py::TestApiContainer::test_options[options1-name-foo] tests/test_containers.py::TestApiContainer::test_options[options2-path_prefix-value2] tests/test_containers.py::TestApiContainer::test_options[options3-path_prefix-value3] tests/test_containers.py::TestApiContainer::test_options[options4-path_prefix-value4] tests/test_containers.py::TestApiContainer::test_op_paths tests/test_containers.py::TestApiContainer::test_op_paths__no_sub_path tests/test_containers.py::TestApiCollection::test_version_options[options0-1-v1-path_prefix0] tests/test_containers.py::TestApiCollection::test_version_options[options1-2-v2-path_prefix1] tests/test_containers.py::TestApiCollection::test_version_options[options2-3-version-3-path_prefix2] tests/test_containers.py::TestApiCollection::test_register_operation tests/test_containers.py::TestApiInterfaceBase::test_options[options0-api-False-path_prefix0] tests/test_containers.py::TestApiInterfaceBase::test_options[options1-!api-False-path_prefix1] tests/test_containers.py::TestApiInterfaceBase::test_options[options2-api-False-path_prefix2] tests/test_containers.py::TestApiInterfaceBase::test_options[options3-api-True-path_prefix3] tests/test_containers.py::TestApiInterfaceBase::test_init_non_absolute tests/test_containers.py::TestApiInterfaceBase::test_dispatch tests/test_containers.py::TestApiInterfaceBase::test_dispatch__invalid_headers[r0-422-Unprocessable tests/test_containers.py::TestApiInterfaceBase::test_dispatch__invalid_headers[r1-406-URI tests/test_containers.py::TestApiInterfaceBase::test_dispatch__invalid_headers[r2-405-Specified tests/test_containers.py::TestApiInterfaceBase::test_dispatch__exceptions[error0-HTTPStatus.NOT_MODIFIED] tests/test_containers.py::TestApiInterfaceBase::test_dispatch__exceptions[error1-400] tests/test_containers.py::TestApiInterfaceBase::test_dispatch__exceptions[error2-400] tests/test_containers.py::TestApiInterfaceBase::test_dispatch__exceptions[NotImplementedError-501] tests/test_containers.py::TestApiInterfaceBase::test_dispatch__exceptions[ValueError-500] tests/test_containers.py::TestApiInterfaceBase::test_dispatch__exceptions[error5-500] tests/test_containers.py::TestApiInterfaceBase::test_dispatch__with_middleware tests/test_containers.py::TestApiInterfaceBase::test_dispatch__error_with_debug_enabled tests/test_containers.py::TestApiInterfaceBase::test_dispatch__error_handled_by_middleware_raises_exception tests/test_containers.py::TestApiInterfaceBase::test_dispatch__encode_error_with_debug_enabled tests/test_containers.py::TestApiInterfaceBase::test_dispatch__http_response tests/test_containers.py::TestApiInterfaceBase::test_op_paths tests/test_containers.py::TestApiInterfaceBase::test_op_paths__collate_methods