def METHOD_NAME(self) -> None:
    """Check we close all coroutines, even if closing the first raises an Exception.
    We also check that an Exception of some kind is raised, but we don't make any
    assertions about its attributes or type.
    """
    parser = SendJoinParser(RoomVersions.V1, False)
    response = {"servers_in_room": ["hs1", "hs2"]}
    serialisation = json.dumps(response).encode()
    # Mock the coroutines managed by this parser.
    # The first one will error when we try to close it.
    coro_1 = Mock()
    coro_1.close = Mock(side_effect=RuntimeError("Couldn't close coro 1"))
    coro_2 = Mock()
    coro_3 = Mock()
    coro_3.close = Mock(side_effect=RuntimeError("Couldn't close coro 3"))
    original_coros = parser._coros
    parser._coros = [coro_1, coro_2, coro_3]
    # Close the original coroutines. If we don't, when we garbage collect them
    # they will throw, failing the test. (Oddly, this only started in CPython 3.11).
    for coro in original_coros:
        try:
            coro.close()
        except ijson.common.IncompleteJSONError:
            pass
    # Send half of the data to the parser
    parser.write(serialisation[: len(serialisation) // 2])
    # Close the parser. There should be _some_ kind of exception.
    with self.assertRaises(ExceptionBundle):
        parser.finish()
    # In any case, we should have tried to close both coros.
    coro_1.close.assert_called()
    coro_2.close.assert_called()
    coro_3.close.assert_called()