Source code for polymarket_mcp.errors

"""Structured error types for the Polymarket MCP package.

Purpose:
    Provide domain-specific exceptions and helpers for surfacing upstream API
    failures with clear, typed context.

Design:
    Errors are separated from transport and service code so upstream HTTP issues
    can be normalized once and handled consistently across the package.

Attributes:
    PolymarketError:
        Base package exception.
    UpstreamRequestError:
        Raised when a request to a Polymarket upstream service fails.
    UpstreamResponseError:
        Raised when a Polymarket upstream service returns malformed data.
"""

from __future__ import annotations

from http import HTTPStatus


[docs] class PolymarketError(Exception): """Base package exception. Args: message: Human-readable error description. Returns: None. Raises: None. """
[docs] class UpstreamRequestError(PolymarketError): """Raised when a Polymarket upstream request fails. Args: domain: Upstream API domain such as ``gamma`` or ``clob``. path: Relative request path. message: Human-readable error description. status_code: Optional upstream HTTP status code. Returns: None. Raises: None. """ def __init__( self, *, domain: str, path: str, message: str, status_code: int | None = None, ) -> None: self.domain = domain self.path = path self.message = message self.status_code = status_code super().__init__(self.__str__()) @property def status_name(self) -> str | None: """Return a symbolic HTTP status name when available. Args: None. Returns: str | None: Symbolic status name such as ``NOT_FOUND``. Raises: ValueError: If the status code is invalid. """ if self.status_code is None: return None return HTTPStatus(self.status_code).name def __str__(self) -> str: """Render the exception as a compact message. Args: None. Returns: str: Human-readable error message. Raises: None. """ status_fragment = ( f" status={self.status_code}({self.status_name})" if self.status_code is not None else "" ) return ( f"Upstream request failed for domain={self.domain} path={self.path}." f"{status_fragment} message={self.message}" )
[docs] class UpstreamResponseError(PolymarketError): """Raised when an upstream response cannot be normalized safely. Args: domain: Upstream API domain such as ``gamma`` or ``data``. path: Relative request path. message: Human-readable error description. Returns: None. Raises: None. """ def __init__(self, *, domain: str, path: str, message: str) -> None: self.domain = domain self.path = path self.message = message super().__init__(self.__str__()) def __str__(self) -> str: """Render the exception as a compact message. Args: None. Returns: str: Human-readable error message. Raises: None. """ return ( f"Upstream response could not be normalized for domain={self.domain} " f"path={self.path}. message={self.message}" )