"""Set of Error classes for gym.""" import warnings class Error(Exception): """Error superclass.""" # Local errors class Unregistered(Error): """Raised when the user requests an item from the registry that does not actually exist.""" class UnregisteredEnv(Unregistered): """Raised when the user requests an env from the registry that does not actually exist.""" class NamespaceNotFound(UnregisteredEnv): """Raised when the user requests an env from the registry where the namespace doesn't exist.""" class NameNotFound(UnregisteredEnv): """Raised when the user requests an env from the registry where the name doesn't exist.""" class VersionNotFound(UnregisteredEnv): """Raised when the user requests an env from the registry where the version doesn't exist.""" class UnregisteredBenchmark(Unregistered): """Raised when the user requests an env from the registry that does not actually exist.""" class DeprecatedEnv(Error): """Raised when the user requests an env from the registry with an older version number than the latest env with the same name.""" class RegistrationError(Error): """Raised when the user attempts to register an invalid env. For example, an unversioned env when a versioned env exists.""" class UnseedableEnv(Error): """Raised when the user tries to seed an env that does not support seeding.""" class DependencyNotInstalled(Error): """Raised when the user has not installed a dependency.""" class UnsupportedMode(Error): """Raised when the user requests a rendering mode not supported by the environment.""" class ResetNeeded(Error): """When the order enforcing is violated, i.e. step or render is called before reset.""" class ResetNotAllowed(Error): """When the monitor is active, raised when the user tries to step an environment that's not yet terminated or truncated.""" class InvalidAction(Error): """Raised when the user performs an action not contained within the action space.""" # API errors class APIError(Error): """Deprecated, to be removed at gym 1.0.""" def __init__( self, message=None, http_body=None, http_status=None, json_body=None, headers=None, ): """Initialise API error.""" super().__init__(message) warnings.warn("APIError is deprecated and will be removed at gym 1.0") if http_body and hasattr(http_body, "decode"): try: http_body = http_body.decode("utf-8") except Exception: http_body = "" self._message = message self.http_body = http_body self.http_status = http_status self.json_body = json_body self.headers = headers or {} self.request_id = self.headers.get("request-id", None) def __unicode__(self): """Returns a string, if request_id is not None then make message other use the _message.""" if self.request_id is not None: msg = self._message or "" return f"Request {self.request_id}: {msg}" else: return self._message def __str__(self): """Returns the __unicode__.""" return self.__unicode__() class APIConnectionError(APIError): """Deprecated, to be removed at gym 1.0.""" class InvalidRequestError(APIError): """Deprecated, to be removed at gym 1.0.""" def __init__( self, message, param, http_body=None, http_status=None, json_body=None, headers=None, ): """Initialises the invalid request error.""" super().__init__(message, http_body, http_status, json_body, headers) self.param = param class AuthenticationError(APIError): """Deprecated, to be removed at gym 1.0.""" class RateLimitError(APIError): """Deprecated, to be removed at gym 1.0.""" # Video errors class VideoRecorderError(Error): """Unused error.""" class InvalidFrame(Error): """Error message when an invalid frame is captured.""" # Wrapper errors class DoubleWrapperError(Error): """Error message for when using double wrappers.""" class WrapAfterConfigureError(Error): """Error message for using wrap after configure.""" class RetriesExceededError(Error): """Error message for retries exceeding set number.""" # Vectorized environments errors class AlreadyPendingCallError(Exception): """Raised when `reset`, or `step` is called asynchronously (e.g. with `reset_async`, or `step_async` respectively), and `reset_async`, or `step_async` (respectively) is called again (without a complete call to `reset_wait`, or `step_wait` respectively).""" def __init__(self, message: str, name: str): """Initialises the exception with name attributes.""" super().__init__(message) self.name = name class NoAsyncCallError(Exception): """Raised when an asynchronous `reset`, or `step` is not running, but `reset_wait`, or `step_wait` (respectively) is called.""" def __init__(self, message: str, name: str): """Initialises the exception with name attributes.""" super().__init__(message) self.name = name class ClosedEnvironmentError(Exception): """Trying to call `reset`, or `step`, while the environment is closed.""" class CustomSpaceError(Exception): """The space is a custom gym.Space instance, and is not supported by `AsyncVectorEnv` with `shared_memory=True`."""