Fix double printing of exception when initializing resource causes error

This commit is contained in:
Roman Mogylatov 2021-02-16 07:55:01 -05:00
parent b2ea773c71
commit f470400bbe
4 changed files with 1659 additions and 1630 deletions

View File

@ -7,6 +7,10 @@ that were made in every particular version.
From version 0.7.6 *Dependency Injector* framework strictly From version 0.7.6 *Dependency Injector* framework strictly
follows `Semantic versioning`_ follows `Semantic versioning`_
Development version
-------------------
- Fix double printing of exception when initializing resource causes error.
4.23.1 4.23.1
------ ------
- Hotfix a bug with importing FastAPI ``Request``. - Hotfix a bug with importing FastAPI ``Request``.

File diff suppressed because it is too large Load Diff

View File

@ -3486,7 +3486,6 @@ cdef class Resource(Provider):
resource = initializer.result() resource = initializer.result()
except Exception: except Exception:
self.__initialized = False self.__initialized = False
raise
else: else:
self.__resource = resource self.__resource = resource
self.__shutdowner = shutdowner self.__shutdowner = shutdowner

View File

@ -449,14 +449,45 @@ class AsyncResourceTest(AsyncTestCase):
self.assertTrue(provider.initialized) self.assertTrue(provider.initialized)
self.assertTrue(provider.is_async_mode_enabled()) self.assertTrue(provider.is_async_mode_enabled())
# Disable default exception handling to prevent output with self.assertRaises(RuntimeError):
asyncio.get_event_loop().set_exception_handler(lambda loop, context: ...) self._run(future)
self.assertFalse(provider.initialized)
self.assertTrue(provider.is_async_mode_enabled())
def test_init_async_gen_with_error(self):
async def _init():
raise RuntimeError()
yield
provider = providers.Resource(_init)
future = provider()
self.assertTrue(provider.initialized)
self.assertTrue(provider.is_async_mode_enabled())
with self.assertRaises(RuntimeError): with self.assertRaises(RuntimeError):
self._run(future) self._run(future)
# Restore default exception handling self.assertFalse(provider.initialized)
asyncio.get_event_loop().set_exception_handler(None) self.assertTrue(provider.is_async_mode_enabled())
def test_init_async_subclass_with_error(self):
class _Resource(resources.AsyncResource):
async def init(self):
raise RuntimeError()
async def shutdown(self, resource):
pass
provider = providers.Resource(_Resource)
future = provider()
self.assertTrue(provider.initialized)
self.assertTrue(provider.is_async_mode_enabled())
with self.assertRaises(RuntimeError):
self._run(future)
self.assertFalse(provider.initialized) self.assertFalse(provider.initialized)
self.assertTrue(provider.is_async_mode_enabled()) self.assertTrue(provider.is_async_mode_enabled())