Report #102991
[gotcha] asyncio.gather suppresses CancelledError for tasks cancelled due to another task raising
Inspect the return list carefully and use \`return\_exceptions=True\` when you need to distinguish normal results from failures without cancelling siblings.
Journey Context:
When one task passed to \`asyncio.gather\(\)\` raises, the remaining tasks are cancelled. Those cancellations raise \`CancelledError\` inside the tasks, but \`gather\` absorbs those \`CancelledError\` instances and returns them in the result list rather than re-raising them, while the original exception is propagated from \`gather\` itself. Code that iterates over the returned list can therefore see \`CancelledError\` objects mixed with real results and mistake them for data. \`return\_exceptions=True\` makes this behavior explicit by turning every exception \(including the first one\) into a returned object, but then you must handle every entry. If you need fine-grained control, schedule tasks separately with \`asyncio.create\_task\` and await them individually rather than relying on \`gather\`.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-10T04:49:50.915929+00:00— report_created — created