OpenBB-finance/OpenBB · error · OpenBBError

Error fetching ports data

Error message

Error fetching ports data: {e} -> {e.args}

What it means

Catch-all wrapper in get_ports: any exception raised inside the async fetch (including the non-200 OpenBBError from 621, JSON decode errors, or client disconnects) is re-raised as an OpenBBError with the original exception and its args. It signals the ports lookup failed for an underlying reason detailed in the message.

Solutions

  1. Read the inner exception text after '->': it names the true cause (e.g. TimeoutError, ContentTypeError, status code).
  2. Fix the underlying cause: network connectivity, proxy/TLS config, or simply retry for transient faults.
  3. Verify the ports FeatureServer URL responds with JSON (curl with ?f=json).
  4. If the inner error is the status-code OpenBBError, follow the guidance for that error (retry/backoff).
Defensive patterns

Strategy: try-catch

Try / catch

try:
    ports = await get_ports()
except OpenBBError as e:
    msg = str(e)
    if 'ClientConnectorError' in msg or 'Timeout' in msg:
        handle_network_issue(msg)
    elif 'Failed to fetch ports data' in msg:
        handle_http_status(msg)
    else:
        raise

Prevention

When it happens

Trigger: The session.get throws (DNS failure, TLS error, timeout), response.json() fails on a non-JSON error page, or the status-check OpenBBError at line 421 propagates into this handler.

Common situations: Offline environments, SSL certificate issues behind corporate proxies, ArcGIS returning an HTML error page instead of JSON, or any transient network fault during the ports-table bootstrap.

Related errors


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/a931b03eefd6bbd5. Report an issue: GitHub.

Appendix: source

Thrown at openbb_platform/providers/imf/openbb_imf/utils/port_watch_helpers.py:429

    ports: list[dict] = []

    try:
        async with await get_async_requests_session() as session, await session.get(
            url
        ) as response:
            if response.status != 200:
                raise OpenBBError(
                    f"Failed to fetch ports data: {response.status} - {response.reason}"
                )
            data = await response.json()

            for feature in data.get("features", []):
                ports.append(feature.get("attributes", {}))

        return ports

    except Exception as e:
        raise OpenBBError(f"Error fetching ports data: {e} -> {e.args}") from e


def get_ports() -> list[dict[str, Any]]:
    """Get the list of all ports synchronously."""
    # pylint: disable=import-outside-toplevel
    import asyncio

    try:
        loop = asyncio.get_running_loop()
    except RuntimeError:
        loop = None

    if loop is not None:
        # Already in an async context
        import concurrent.futures

        with concurrent.futures.ThreadPoolExecutor() as executor:
            future = executor.submit(asyncio.run, list_ports())

View on GitHub (pinned to 3e071fcc2c)