New GitHub issue #95704 from graingert:<br>

<hr>

<pre>
The suggestion was to always check for Cancellation in every finally block in async context managers, however sometimes there's no finally block visible and the problem applies to synchronous context managers too

In this demo I'd expect to be able to print: "handled attribute error"

```python
import asyncio
import contextlib

async def child(sock):
    try:
        with contextlib.closing(sock):
            await asyncio.sleep(2)
    except Exception as e:
        print(f"child task got error: {type(e)=} {e=}")
        raise

class Sock:
    async def aclose(self):
        await asyncio.sleep(1)

async def main():
    try:
        sock = Sock()
        async with asyncio.timeout(1):
            async with asyncio.TaskGroup() as tg:
                # Make two concurrent calls to child()
                tg.create_task(child(Sock()))
                tg.create_task(child(Sock()))
                async with contextlib.aclosing(sock):
                    await asyncio.sleep(2)
    except* AttributeError:
        print("handled attribute error")


asyncio.run(main())
```
</pre>

<hr>

<a href="https://github.com/python/cpython/issues/95704">View on GitHub</a>
<p>Labels: type-bug</p>
<p>Assignee: </p>