When using asyncio.gather(*tasks) without return_exceptions=True, a single exception aborts the gather context immediately, leaving sibling background tasks running as unreferenced orphans in the event loop.
import asyncio
async def worker(idx: int):
if idx == 2:
raise ValueError("Critical node error")
await asyncio.sleep(10)
async def main():
# If worker(2) fails, worker(1) and worker(3) keep running in the background!
await asyncio.gather(worker(1), worker(2), worker(3))