diff --git a/hapic/context.py b/hapic/context.py
index 5a9aa19..97aa0c4 100644
--- a/hapic/context.py
+++ b/hapic/context.py
@@ -1,4 +1,5 @@
 # -*- coding: utf-8 -*-
+import json
 import typing
 
 from hapic.error import ErrorBuilderInterface
@@ -106,8 +107,121 @@ class ContextInterface(object):
         """
         raise NotImplementedError()
 
+    def handle_exception(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        """
+        Enable management of this exception during execution of views. If this
+        exception caught, an http response will be returned with this http
+        code.
+        :param exception_class: Exception class to catch
+        :param http_code: HTTP code to use in response if exception caught
+        """
+        raise NotImplementedError()
+
+    def handle_exceptions(
+        self,
+        exception_classes: typing.List[typing.Type[Exception]],
+        http_code: int,
+    ) -> None:
+        """
+        Enable management of these exceptions during execution of views. If
+        this exception caught, an http response will be returned with this http
+        code.
+        :param exception_classes: Exception classes to catch
+        :param http_code: HTTP code to use in response if exception caught
+        """
+        raise NotImplementedError()
+
+
+class HandledException(object):
+    """
+    Representation of an handled exception with it's http code
+    """
+    def __init__(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int = 500,
+    ):
+        self.exception_class = exception_class
+        self.http_code = http_code
+
 
 class BaseContext(ContextInterface):
     def get_default_error_builder(self) -> ErrorBuilderInterface:
         """ see hapic.context.ContextInterface#get_default_error_builder"""
         return self.default_error_builder
+
+    def handle_exception(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        self._add_exception_class_to_catch(exception_class, http_code)
+
+    def handle_exceptions(
+        self,
+        exception_classes: typing.List[typing.Type[Exception]],
+        http_code: int,
+    ) -> None:
+        for exception_class in exception_classes:
+            self._add_exception_class_to_catch(exception_class, http_code)
+
+    def handle_exceptions_decorator_builder(
+        self,
+        func: typing.Callable[..., typing.Any],
+    ) -> typing.Callable[..., typing.Any]:
+        """
+        Return a decorator who catch exceptions raised during given function
+        execution and return a response built by the default error builder.
+
+        :param func: decorated function
+        :return: the decorator
+        """
+        def decorator(*args, **kwargs):
+            try:
+                return func(*args, **kwargs)
+            except Exception as exc:
+                # Reverse list to read first user given exception before
+                # the hapic default Exception catch
+                handled_exceptions = reversed(
+                    self._get_handled_exception_class_and_http_codes(),
+                )
+                for handled_exception in handled_exceptions:
+                    # TODO BS 2018-05-04: How to be attentive to hierarchy ?
+                    if isinstance(exc, handled_exception.exception_class):
+                        error_builder = self.get_default_error_builder()
+                        error_body = error_builder.build_from_exception(exc)
+                        return self.get_response(
+                            json.dumps(error_body),
+                            handled_exception.http_code,
+                        )
+                raise exc
+
+        return decorator
+
+    def _get_handled_exception_class_and_http_codes(
+        self,
+    ) -> typing.List[HandledException]:
+        """
+        :return: A list of tuple where: thirst item of tuple is a exception
+        class and second tuple item is a http code. This list will be used by
+        `handle_exceptions_decorator_builder` decorator to catch exceptions.
+        """
+        raise NotImplementedError()
+
+    def _add_exception_class_to_catch(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        """
+        Add an exception class to catch and matching http code. Will be used by
+        `handle_exceptions_decorator_builder` decorator to catch exceptions.
+        :param exception_class: exception class to catch
+        :param http_code: http code to use if this exception catched
+        :return:
+        """
+        raise NotImplementedError()
diff --git a/hapic/ext/bottle/context.py b/hapic/ext/bottle/context.py
index 39237ab..c5090b8 100644
--- a/hapic/ext/bottle/context.py
+++ b/hapic/ext/bottle/context.py
@@ -12,6 +12,7 @@ import bottle
 from multidict import MultiDict
 
 from hapic.context import BaseContext
+from hapic.context import HandledException
 from hapic.context import RouteRepresentation
 from hapic.decorator import DecoratedController
 from hapic.decorator import DECORATION_ATTRIBUTE_NAME
@@ -33,6 +34,8 @@ class BottleContext(BaseContext):
         app: bottle.Bottle,
         default_error_builder: ErrorBuilderInterface=None,
     ):
+        self._handled_exceptions = []  # type: typing.List[HandledException]  # nopep8
+        self._exceptions_handler_installed = False
         self.app = app
         self.default_error_builder = \
             default_error_builder or DefaultErrorBuilder()  # FDV
@@ -134,3 +137,30 @@ class BottleContext(BaseContext):
         if isinstance(response, bottle.HTTPResponse):
             return True
         return False
+
+    def _add_exception_class_to_catch(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        if not self._exceptions_handler_installed:
+            self._install_exceptions_handler()
+
+        self._handled_exceptions.append(
+            HandledException(exception_class, http_code),
+        )
+
+    def _install_exceptions_handler(self) -> None:
+        """
+        Setup the bottle app to enable exception catching with internal
+        hapic exception catcher.
+        """
+        self.app.install(self.handle_exceptions_decorator_builder)
+
+    def _get_handled_exception_class_and_http_codes(
+        self,
+    ) -> typing.List[HandledException]:
+        """
+        See hapic.context.BaseContext#_get_handled_exception_class_and_http_codes  # nopep8
+        """
+        return self._handled_exceptions
diff --git a/hapic/ext/flask/context.py b/hapic/ext/flask/context.py
index 035fdfe..0908dc2 100644
--- a/hapic/ext/flask/context.py
+++ b/hapic/ext/flask/context.py
@@ -33,6 +33,7 @@ class FlaskContext(BaseContext):
         app: Flask,
         default_error_builder: ErrorBuilderInterface=None,
     ):
+        self._handled_exceptions = []  # type: typing.List[HandledException]  # nopep8
         self.app = app
         self.default_error_builder = \
             default_error_builder or DefaultErrorBuilder()  # FDV
@@ -157,3 +158,10 @@ class FlaskContext(BaseContext):
         )
         def api_doc(path):
             return send_from_directory(directory_path, path)
+
+    def _add_exception_class_to_catch(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        raise NotImplementedError('TODO')
diff --git a/hapic/ext/pyramid/context.py b/hapic/ext/pyramid/context.py
index e0dfcb7..d39b615 100644
--- a/hapic/ext/pyramid/context.py
+++ b/hapic/ext/pyramid/context.py
@@ -32,6 +32,7 @@ class PyramidContext(BaseContext):
         configurator: 'Configurator',
         default_error_builder: ErrorBuilderInterface = None,
     ):
+        self._handled_exceptions = []  # type: typing.List[HandledException]  # nopep8
         self.configurator = configurator
         self.default_error_builder = \
             default_error_builder or DefaultErrorBuilder()  # FDV
@@ -181,3 +182,10 @@ class PyramidContext(BaseContext):
             name=route_prefix,
             path=directory_path,
         )
+
+    def _add_exception_class_to_catch(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        raise NotImplementedError('TODO')

Add a feature to manage exceptions globally
Currently : if I need to manage an exception for all my endpoints (for example catch `Exception` in order to generate a proper `HTTP 500`), I must add `hapic.handle_exception()` decorator on every route.

Expected : I'd like to be able to define generic exception handling which would be added automatically to every route of my APIs.

The way to do so:

Add two global methods `context.handle_exception()` and `context.handle_exceptions()` which will catch exception(s) and return properly built error responses

The implementation may be something like this:

```
# Bottle context

class BottleContext(...):
    def try_catch_decorator_builder():
        # return a decorator function
        [...]

    def handle_exception(exception_class, http_error_code):
        bottle.install(try_catch_decorator_builder)
        [...]

# Pyramid context
class PyramidContext(...):
    def handle_exception(exception_class, http_error_code):
        pyramid.add_error_view(exception_class, http_error_code)
        [...]

[...]
```


diff --git a/tests/base.py b/tests/base.py
index 7c54b09..1286176 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -1,5 +1,8 @@
 # -*- coding: utf-8 -*-
+import json
 import typing
+
+
 try:  # Python 3.5+
     from http import HTTPStatus
 except ImportError:
@@ -10,6 +13,7 @@ from multidict import MultiDict
 from hapic.ext.bottle import BottleContext
 from hapic.processor import RequestParameters
 from hapic.processor import ProcessValidationError
+from hapic.context import HandledException
 
 
 class Base(object):
@@ -29,6 +33,8 @@ class MyContext(BottleContext):
         fake_files_parameters=None,
     ) -> None:
         super().__init__(app=app)
+        self._handled_exceptions = []  # type: typing.List[HandledException]  # nopep8
+        self._exceptions_handler_installed = False
         self.fake_path_parameters = fake_path_parameters or {}
         self.fake_query_parameters = fake_query_parameters or MultiDict()
         self.fake_body_parameters = fake_body_parameters or {}
@@ -46,23 +52,34 @@ class MyContext(BottleContext):
             files_parameters=self.fake_files_parameters,
         )
 
-    def get_response(
-        self,
-        response: str,
-        http_code: int,
-        mimetype: str='application/json',
-    ) -> typing.Any:
-        return {
-            'original_response': response,
-            'http_code': http_code,
-        }
-
     def get_validation_error_response(
         self,
         error: ProcessValidationError,
         http_code: HTTPStatus=HTTPStatus.BAD_REQUEST,
     ) -> typing.Any:
-        return {
-            'original_error': error,
-            'http_code': http_code,
-        }
+        return self.get_response(
+            response=json.dumps({
+                'original_error': {
+                    'details': error.details,
+                    'message': error.message,
+                },
+                'http_code': http_code,
+            }),
+            http_code=http_code,
+        )
+
+    def _add_exception_class_to_catch(
+        self,
+        exception_class: typing.Type[Exception],
+        http_code: int,
+    ) -> None:
+        if not self._exceptions_handler_installed:
+            self._install_exceptions_handler()
+        self._handled_exceptions.append(
+            HandledException(exception_class, http_code),
+        )
+
+    def _get_handled_exception_class_and_http_codes(
+        self,
+    ) -> typing.List[HandledException]:
+        return self._handled_exceptions
diff --git a/tests/ext/unit/test_bottle.py b/tests/ext/unit/test_bottle.py
index cab6057..979e1e9 100644
--- a/tests/ext/unit/test_bottle.py
+++ b/tests/ext/unit/test_bottle.py
@@ -1,7 +1,9 @@
 # -*- coding: utf-8 -*-
 import bottle
+from webtest import TestApp
 
 import hapic
+from hapic.ext.bottle import BottleContext
 from tests.base import Base
 
 
@@ -74,3 +76,20 @@ class TestBottleExt(Base):
         assert route.original_route_object.callback != MyControllers.controller_a  # nopep8
         assert route.original_route_object.callback != decoration.reference.wrapped  # nopep8
         assert route.original_route_object.callback != decoration.reference.wrapper  # nopep8
+
+    def test_unit__general_exception_handling__ok__nominal_case(self):
+        hapic_ = hapic.Hapic()
+        app = bottle.Bottle()
+        context = BottleContext(app=app)
+        hapic_.set_context(context)
+
+        def my_view():
+            raise ZeroDivisionError('An exception message')
+
+        app.route('/my-view', method='GET', callback=my_view)
+        context.handle_exception(ZeroDivisionError, http_code=400)
+
+        test_app = TestApp(app)
+        response = test_app.get('/my-view', status='*')
+
+        assert 400 == response.status_code
diff --git a/tests/func/test_exception_handling.py b/tests/func/test_exception_handling.py
new file mode 100644
index 0000000..4458660
--- /dev/null
+++ b/tests/func/test_exception_handling.py
@@ -0,0 +1,27 @@
+# coding: utf-8
+import bottle
+from webtest import TestApp
+
+from hapic import Hapic
+from tests.base import Base
+from tests.base import MyContext
+
+
+class TestExceptionHandling(Base):
+    def test_func__catch_one_exception__ok__nominal_case(self):
+        hapic = Hapic()
+        # TODO BS 2018-05-04: Make this test non-bottle
+        app = bottle.Bottle()
+        context = MyContext(app=app)
+        hapic.set_context(context)
+
+        def my_view():
+            raise ZeroDivisionError('An exception message')
+
+        app.route('/my-view', method='GET', callback=my_view)
+        context.handle_exception(ZeroDivisionError, http_code=400)
+
+        test_app = TestApp(app)
+        response = test_app.get('/my-view', status='*')
+
+        assert 400 == response.status_code
diff --git a/tests/func/test_marshmallow_decoration.py b/tests/func/test_marshmallow_decoration.py
index 9223a14..331fe9a 100644
--- a/tests/func/test_marshmallow_decoration.py
+++ b/tests/func/test_marshmallow_decoration.py
@@ -1,4 +1,6 @@
 # coding: utf-8
+import json
+
 try:  # Python 3.5+
     from http import HTTPStatus
 except ImportError:
@@ -52,11 +54,16 @@ class TestMarshmallowDecoration(Base):
             return 'OK'
 
         result = my_controller()
-        assert 'http_code' in result
-        assert HTTPStatus.BAD_REQUEST == result['http_code']
+        assert HTTPStatus.BAD_REQUEST == result.status_code
         assert {
-                   'file_abc': ['Missing data for required field.']
-               } == result['original_error'].details
+                    'http_code': 400,
+                    'original_error': {
+                        'details': {
+                            'file_abc': ['Missing data for required field.']
+                        },
+                        'message': 'Validation error of input data'
+                    }
+               } == json.loads(result.body)
 
     def test_unit__input_files__ok__file_is_empty_string(self):
         hapic = Hapic()
@@ -77,6 +84,13 @@ class TestMarshmallowDecoration(Base):
             return 'OK'
 
         result = my_controller()
-        assert 'http_code' in result
-        assert HTTPStatus.BAD_REQUEST == result['http_code']
-        assert {'file_abc': ['Missing data for required field']} == result['original_error'].details
+        assert HTTPStatus.BAD_REQUEST == result.status_code
+        assert {
+                    'http_code': 400,
+                    'original_error': {
+                        'details': {
+                            'file_abc': ['Missing data for required field']
+                        },
+                        'message': 'Validation error of input data'
+                    }
+               } == json.loads(result.body)
diff --git a/tests/unit/test_decorator.py b/tests/unit/test_decorator.py
index 43f6a7b..e088a8a 100644
--- a/tests/unit/test_decorator.py
+++ b/tests/unit/test_decorator.py
@@ -233,11 +233,8 @@ class TestOutputControllerWrapper(Base):
             return foo
 
         result = func(42)
-        # see MyProcessor#process
-        assert {
-                   'http_code': HTTPStatus.OK,
-                   'original_response': '43',
-               } == result
+        assert HTTPStatus.OK == result.status_code
+        assert '43' == result.body
 
     def test_unit__output_data_wrapping__fail__error_response(self):
         context = MyContext(app=None)
@@ -250,14 +247,16 @@ class TestOutputControllerWrapper(Base):
             return 'wrong result format'
 
         result = func(42)
-        # see MyProcessor#process
-        assert isinstance(result, dict)
-        assert 'http_code' in result
-        assert result['http_code'] == HTTPStatus.INTERNAL_SERVER_ERROR
-        assert 'original_error' in result
-        assert result['original_error'].details == {
-            'name': ['Missing data for required field.']
-        }
+        assert HTTPStatus.INTERNAL_SERVER_ERROR == result.status_code
+        assert {
+                   'original_error': {
+                       'details': {
+                           'name': ['Missing data for required field.']
+                       },
+                       'message': 'Validation error of output data'
+                   },
+                   'http_code': 500,
+               } == json.loads(result.body)
 
 
 class TestExceptionHandlerControllerWrapper(Base):
@@ -275,14 +274,12 @@ class TestExceptionHandlerControllerWrapper(Base):
             raise ZeroDivisionError('We are testing')
 
         response = func(42)
-        assert 'http_code' in response
-        assert response['http_code'] == HTTPStatus.INTERNAL_SERVER_ERROR
-        assert 'original_response' in response
-        assert json.loads(response['original_response']) == {
-            'message': 'We are testing',
-            'details': {},
-            'code': None,
-        }
+        assert HTTPStatus.INTERNAL_SERVER_ERROR == response.status_code
+        assert {
+                   'details': {},
+                   'message': 'We are testing',
+                   'code': None,
+               } == json.loads(response.body)
 
     def test_unit__exception_handled__ok__exception_error_dict(self):
         class MyException(Exception):
@@ -305,14 +302,12 @@ class TestExceptionHandlerControllerWrapper(Base):
             raise exc
 
         response = func(42)
-        assert 'http_code' in response
-        assert response['http_code'] == HTTPStatus.INTERNAL_SERVER_ERROR
-        assert 'original_response' in response
-        assert json.loads(response['original_response']) == {
+        assert response.status_code == HTTPStatus.INTERNAL_SERVER_ERROR
+        assert {
             'message': 'We are testing',
             'details': {'foo': 'bar'},
             'code': None,
-        }
+        } == json.loads(response.body)
 
     def test_unit__exception_handler__error__error_content_malformed(self):
         class MyException(Exception):

pip install -e .[dev]
parse_log_pytest
pytest
pytest pytest-cov
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
beautifulsoup4==4.12.3
bottle==0.13.2
certifi==2021.5.30
charset-normalizer==2.0.12
click==8.0.4
coverage==6.2
dataclasses==0.8
Flask==2.0.3
-e git+https://github.com/algoo/hapic.git@a1e94438f12271721344ee459a7e31d4458a42ae#egg=hapic
hapic-apispec==0.35.0
hupper==1.10.3
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
itsdangerous==2.0.1
Jinja2==3.0.3
MarkupSafe==2.0.1
marshmallow==2.21.0
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
multidict==5.2.0
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
PasteDeploy==2.1.1
plaster==1.0
plaster-pastedeploy==0.7
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pyramid==2.0.2
pytest==6.2.4
pytest-cov==4.0.0
PyYAML==6.0.1
requests==2.27.1
soupsieve==2.3.2.post1
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
tomli==1.2.3
translationstring==1.4
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
venusian==3.0.0
waitress==2.0.0
WebOb==1.8.9
WebTest==3.0.0
Werkzeug==2.0.3
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work
zope.deprecation==4.4.0
zope.interface==5.5.2

name: hapic
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - beautifulsoup4==4.12.3
      - bottle==0.13.2
      - charset-normalizer==2.0.12
      - click==8.0.4
      - coverage==6.2
      - dataclasses==0.8
      - flask==2.0.3
      - hapic-apispec==0.35.0
      - hupper==1.10.3
      - idna==3.10
      - itsdangerous==2.0.1
      - jinja2==3.0.3
      - markupsafe==2.0.1
      - marshmallow==2.21.0
      - multidict==5.2.0
      - pastedeploy==2.1.1
      - plaster==1.0
      - plaster-pastedeploy==0.7
      - pyramid==2.0.2
      - pytest-cov==4.0.0
      - pyyaml==6.0.1
      - requests==2.27.1
      - soupsieve==2.3.2.post1
      - tomli==1.2.3
      - translationstring==1.4
      - urllib3==1.26.20
      - venusian==3.0.0
      - waitress==2.0.0
      - webob==1.8.9
      - webtest==3.0.0
      - werkzeug==2.0.3
      - zope-deprecation==4.4.0
      - zope-interface==5.5.2
prefix: /opt/conda/envs/hapic

tests/ext/unit/test_bottle.py::TestBottleExt::test_unit__map_binding__ok__decorated_function tests/ext/unit/test_bottle.py::TestBottleExt::test_unit__map_binding__ok__mapped_function tests/ext/unit/test_bottle.py::TestBottleExt::test_unit__map_binding__ok__mapped_method tests/ext/unit/test_bottle.py::TestBottleExt::test_unit__general_exception_handling__ok__nominal_case tests/func/test_exception_handling.py::TestExceptionHandling::test_func__catch_one_exception__ok__nominal_case tests/func/test_marshmallow_decoration.py::TestMarshmallowDecoration::test_unit__input_files__ok__file_is_present tests/func/test_marshmallow_decoration.py::TestMarshmallowDecoration::test_unit__input_files__ok__file_is_not_present tests/func/test_marshmallow_decoration.py::TestMarshmallowDecoration::test_unit__input_files__ok__file_is_empty_string tests/unit/test_decorator.py::TestControllerWrapper::test_unit__base_controller_wrapper__ok__no_behaviour tests/unit/test_decorator.py::TestControllerWrapper::test_unit__base_controller__ok__replaced_response tests/unit/test_decorator.py::TestControllerWrapper::test_unit__controller_wrapper__ok__overload_input tests/unit/test_decorator.py::TestInputControllerWrapper::test_unit__input_data_wrapping__ok__nominal_case tests/unit/test_decorator.py::TestInputControllerWrapper::test_unit__multi_query_param_values__ok__use_as_list tests/unit/test_decorator.py::TestInputControllerWrapper::test_unit__multi_query_param_values__ok__without_as_list tests/unit/test_decorator.py::TestOutputControllerWrapper::test_unit__output_data_wrapping__ok__nominal_case tests/unit/test_decorator.py::TestOutputControllerWrapper::test_unit__output_data_wrapping__fail__error_response tests/unit/test_decorator.py::TestExceptionHandlerControllerWrapper::test_unit__exception_handled__ok__nominal_case tests/unit/test_decorator.py::TestExceptionHandlerControllerWrapper::test_unit__exception_handled__ok__exception_error_dict tests/unit/test_decorator.py::TestExceptionHandlerControllerWrapper::test_unit__exception_handler__error__error_content_malformed
hapic/ext/bottle/context.py hapic/ext/pyramid/context.py hapic/ext/flask/context.py hapic/context.py
hapic/ext/bottle/context.py hapic/ext/pyramid/context.py hapic/ext/flask/context.py hapic/context.py