From 9273ab3c45695e4503e78050ec5c3e98951349f9 Mon Sep 17 00:00:00 2001 From: Gen Xu Date: Wed, 15 Sep 2021 02:24:24 -0700 Subject: [PATCH] Add locals on callable exception --- src/dependency_injector/providers.pxd | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/dependency_injector/providers.pxd b/src/dependency_injector/providers.pxd index eeae838b..6617dfe4 100644 --- a/src/dependency_injector/providers.pxd +++ b/src/dependency_injector/providers.pxd @@ -477,6 +477,8 @@ cdef inline void __async_prepare_args_kwargs_callback( for value, (key, _) in zip(result, future_args_kwargs): args[key] = value except Exception as exception: + exception.__traceback__.tb_frame.f_locals.clear() + exception.__traceback__.tb_frame.f_locals.update(locals()) future_result.set_exception(exception) else: future_result.set_result(args) @@ -525,6 +527,8 @@ cdef inline void __async_inject_attributes_callback(object future_result, object for name, value in attributes.items(): setattr(instance, name, value) except Exception as exception: + exception.__traceback__.tb_frame.f_locals.clear() + exception.__traceback__.tb_frame.f_locals.update(locals()) future_result.set_exception(exception) else: future_result.set_result(instance) @@ -575,15 +579,20 @@ cdef inline object __call( asyncio.ensure_future(args_kwargs_ready) return future_result - - return call(*args, **kwargs) - + try: + return call(*args, **kwargs) + except Exception as exception: + exception.__traceback__.tb_frame.f_locals.clear() + exception.__traceback__.tb_frame.f_locals.update(locals()) + raise exception cdef inline void __async_call_callback(object future_result, object call, object future): try: args, kwargs = future.result() result = call(*args, **kwargs) except Exception as exception: + exception.__traceback__.tb_frame.f_locals.clear() + exception.__traceback__.tb_frame.f_locals.update(locals()) future_result.set_exception(exception) else: if __is_future_or_coroutine(result): @@ -597,6 +606,8 @@ cdef inline object __async_result_callback(object future_result, object future): try: result = future.result() except Exception as exception: + exception.__traceback__.tb_frame.f_locals.clear() + exception.__traceback__.tb_frame.f_locals.update(locals()) future_result.set_exception(exception) else: future_result.set_result(result)