Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork32.4k
Closed
Description
Reproducer:
importasyncioimportcontextvarsname=contextvars.ContextVar('name',default='foo')defexc_handler(*args):assertname.get()=='bar'asyncdeftask():name.set('bar')1/0asyncdefmain():loop=asyncio.get_running_loop()loop.set_exception_handler(exc_handler)asyncio.create_task(task())asyncio.run(main())
On main:
Unhandled error in exception handlercontext: {'message': 'Task exception was never retrieved', 'exception': ZeroDivisionError('division by zero'), 'future': <Task finished name='Task-2' coro=<task() done, defined at /workspaces/cpython/main.py:11> exception=ZeroDivisionError('division by zero')>}Traceback (most recent call last): File "/workspaces/cpython/Lib/asyncio/base_events.py", line 1797, in call_exception_handler self._exception_handler(self, context) File "/workspaces/cpython/main.py", line 8, in exc_handler assert name.get() == 'bar'AssertionError
The exception handler is called with incorrect context hence theAssertionError
. It should called with the same context as the task.
My use case is retrieving the current request id from the context var if there are any unhandled error but because of this bug, I always get the default value.
Metadata
Metadata
Assignees
Labels
Projects
Status
Done