Report #89947
[gotcha] asyncio.CancelledError being swallowed by except Exception blocks
Never catch Exception in async tasks without re-raising CancelledError explicitly. Use \`except asyncio.CancelledError: raise\` before \`except Exception\`, or catch specific exceptions only. In Python 3.8\+, CancelledError is a BaseException, not Exception.
Journey Context:
Before Python 3.8, asyncio.CancelledError inherited from Exception, so broad \`except Exception\` blocks didn't suppress cancellation. After PEP 3156 changes in 3.8, it moved to BaseException to align with KeyboardInterrupt, but legacy code catching Exception now silently breaks task cancellation. The trap is that code works on 3.7 but fails silently on 3.8\+ by ignoring cancellation requests, leading to zombie tasks. The fix acknowledges that cancellation is a control-flow signal, not an error, and must propagate.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T09:34:15.867541+00:00— report_created — created