-
-
Notifications
You must be signed in to change notification settings - Fork 32.4k
Closed
Labels
3.10only security fixesonly security fixes3.11only security fixesonly security fixes3.12only security fixesonly security fixestopic-asynciotype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Description
Reproducer:
import asyncio
import contextvars
name = contextvars.ContextVar('name', default='foo')
def exc_handler(*args):
assert name.get() == 'bar'
async def task():
name.set('bar')
1/0
async def main():
loop = asyncio.get_running_loop()
loop.set_exception_handler(exc_handler)
asyncio.create_task(task())
asyncio.run(main())
On main:
Unhandled error in exception handler
context: {'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 the AssertionError
. 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
3.10only security fixesonly security fixes3.11only security fixesonly security fixes3.12only security fixesonly security fixestopic-asynciotype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
Projects
Status
Done