Refactoring try blocks with async/await
Let's have async implementation: 

async def async_next(url):
    if url is None:
        return

    try:
        response = await async_send(url)
        return response.json()
    except HTTPError as e:
        if e.response.status_code == 404:
            return
        else:
            raise


Then you can provide following sync bridge:

def next(url):
    return asyncio.run(async_next(url))



Or the following if the event loop is available and running:

def next(url):
    return loop.run_until_complete(async_next(url))



Note: check asyncio high level commands for more details