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
follows `Semantic versioning`_
Development version
-------------------
- Fix double printing of exception when initializing resource causes error.
4.23.1
------
- 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()
except Exception:
self.__initialized = False
raise
else:
self.__resource = resource
self.__shutdowner = shutdowner

View File

@ -449,14 +449,45 @@ class AsyncResourceTest(AsyncTestCase):
self.assertTrue(provider.initialized)
self.assertTrue(provider.is_async_mode_enabled())
# Disable default exception handling to prevent output
asyncio.get_event_loop().set_exception_handler(lambda loop, context: ...)
with self.assertRaises(RuntimeError):
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):
self._run(future)
# Restore default exception handling
asyncio.get_event_loop().set_exception_handler(None)
self.assertFalse(provider.initialized)
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.assertTrue(provider.is_async_mode_enabled())