diff --git a/src/zeep/settings.py b/src/zeep/settings.py index d3241bfc..2a1c329d 100644 --- a/src/zeep/settings.py +++ b/src/zeep/settings.py @@ -65,14 +65,15 @@ def __call__(self, **options): current[key] = getattr(self, key) setattr(self._tls, key, value) - yield - - for key, value in current.items(): - default = getattr(self, key) - if value == default: - delattr(self._tls, key) - else: - setattr(self._tls, key, value) + try: + yield + finally: + for key, value in current.items(): + default = getattr(self, key) + if value == default: + delattr(self._tls, key) + else: + setattr(self._tls, key, value) def __getattribute__(self, key): if key != "_tls" and hasattr(self._tls, key): diff --git a/tests/test_settings.py b/tests/test_settings.py index 87bbf323..8a800541 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -13,3 +13,17 @@ def test_settings_set_context_raw_response(): assert settings.raw_response is True # Check that the original value returned assert settings.raw_response is False + + +def test_settings_set_context_with_exception(): + settings = Settings() + + assert settings.raw_response is False + try: + with settings(raw_response=True): + assert settings.raw_response is True + raise RuntimeError + except RuntimeError: + pass + # Check that the original value returned + assert settings.raw_response is False