Report #9732
[gotcha] asyncio.wait\_for cancels the underlying task on timeout, making it unusable after the exception
Do not await the original task after \`wait\_for\` raises \`TimeoutError\`; treat it as orphaned and cancelled. If you need the result after potential timeout, use \`asyncio.shield\` on the task before passing it to \`wait\_for\`, and manage the shielded task's lifecycle separately.
Journey Context:
When \`wait\_for\` times out, it cancels the wrapped task via \`Task.cancel\(\)\`. The task enters a cancelled state and raises \`CancelledError\` if awaited again, not its original result. This breaks retry patterns that attempt to await the task after catching \`TimeoutError\`. Shielding prevents the cancellation from propagating to the inner task, but requires careful management because the shielded task continues running even if the waiter is cancelled. Alternatives like \`asyncio.timeout\` \(3.11\+\) exhibit similar semantics.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T08:52:22.361583+00:00— report_created — created