from typing import Any, Dict, Optional, Sequence, Type from pydantic import BaseModel, create_model from starlette.exceptions import HTTPException as StarletteHTTPException from starlette.exceptions import WebSocketException as WebSocketException # noqa: F401 class HTTPException(StarletteHTTPException): def __init__( self, status_code: int, detail: Any = None, headers: Optional[Dict[str, str]] = None, ) -> None: super().__init__(status_code=status_code, detail=detail, headers=headers) RequestErrorModel: Type[BaseModel] = create_model("Request") WebSocketErrorModel: Type[BaseModel] = create_model("WebSocket") class FastAPIError(RuntimeError): """ A generic, FastAPI-specific error. """ class ValidationException(Exception): def __init__(self, errors: Sequence[Any]) -> None: self._errors = errors def errors(self) -> Sequence[Any]: return self._errors class RequestValidationError(ValidationException): def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: super().__init__(errors) self.body = body class WebSocketRequestValidationError(ValidationException): pass class ResponseValidationError(ValidationException): def __init__(self, errors: Sequence[Any], *, body: Any = None) -> None: super().__init__(errors) self.body = body def __str__(self) -> str: message = f"{len(self._errors)} validation errors:\n" for err in self._errors: message += f" {err}\n" return message