diff --git a/babel/support.py b/babel/support.py index efe41d562..47f812d8a 100644 --- a/babel/support.py +++ b/babel/support.py @@ -165,7 +165,7 @@ class LazyProxy(object): Hello, universe! Hello, world! """ - __slots__ = ['_func', '_args', '_kwargs', '_value', '_is_cache_enabled'] + __slots__ = ['_func', '_args', '_kwargs', '_value', '_is_cache_enabled', '_attribute_error'] def __init__(self, func, *args, **kwargs): is_cache_enabled = kwargs.pop('enable_cache', True) @@ -175,11 +175,17 @@ def __init__(self, func, *args, **kwargs): object.__setattr__(self, '_kwargs', kwargs) object.__setattr__(self, '_is_cache_enabled', is_cache_enabled) object.__setattr__(self, '_value', None) + object.__setattr__(self, '_attribute_error', None) @property def value(self): if self._value is None: - value = self._func(*self._args, **self._kwargs) + try: + value = self._func(*self._args, **self._kwargs) + except AttributeError as error: + object.__setattr__(self, '_attribute_error', error) + raise + if not self._is_cache_enabled: return value object.__setattr__(self, '_value', value) @@ -249,6 +255,8 @@ def __delattr__(self, name): delattr(self.value, name) def __getattr__(self, name): + if self._attribute_error is not None: + raise self._attribute_error return getattr(self.value, name) def __setattr__(self, name, value): diff --git a/tests/test_support.py b/tests/test_support.py index b4dd823cd..1b74ae8bc 100644 --- a/tests/test_support.py +++ b/tests/test_support.py @@ -279,6 +279,17 @@ def first(xs): self.assertEqual(2, proxy.value) self.assertEqual(1, proxy_deepcopy.value) + def test_handle_attribute_error(self): + + def raise_attribute_error(): + raise AttributeError('message') + + proxy = support.LazyProxy(raise_attribute_error) + with pytest.raises(AttributeError) as exception: + proxy.value + + self.assertEqual('message', str(exception.value)) + def test_format_date(): fmt = support.Format('en_US')