exceptions.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. from __future__ import annotations
  2. import http
  3. import typing
  4. import warnings
  5. __all__ = ("HTTPException", "WebSocketException")
  6. class HTTPException(Exception):
  7. def __init__(
  8. self,
  9. status_code: int,
  10. detail: str | None = None,
  11. headers: typing.Mapping[str, str] | None = None,
  12. ) -> None:
  13. if detail is None:
  14. detail = http.HTTPStatus(status_code).phrase
  15. self.status_code = status_code
  16. self.detail = detail
  17. self.headers = headers
  18. def __str__(self) -> str:
  19. return f"{self.status_code}: {self.detail}"
  20. def __repr__(self) -> str:
  21. class_name = self.__class__.__name__
  22. return f"{class_name}(status_code={self.status_code!r}, detail={self.detail!r})"
  23. class WebSocketException(Exception):
  24. def __init__(self, code: int, reason: str | None = None) -> None:
  25. self.code = code
  26. self.reason = reason or ""
  27. def __str__(self) -> str:
  28. return f"{self.code}: {self.reason}"
  29. def __repr__(self) -> str:
  30. class_name = self.__class__.__name__
  31. return f"{class_name}(code={self.code!r}, reason={self.reason!r})"
  32. __deprecated__ = "ExceptionMiddleware"
  33. def __getattr__(name: str) -> typing.Any: # pragma: no cover
  34. if name == __deprecated__:
  35. from starlette.middleware.exceptions import ExceptionMiddleware
  36. warnings.warn(
  37. f"{__deprecated__} is deprecated on `starlette.exceptions`. "
  38. f"Import it from `starlette.middleware.exceptions` instead.",
  39. category=DeprecationWarning,
  40. stacklevel=3,
  41. )
  42. return ExceptionMiddleware
  43. raise AttributeError(f"module '{__name__}' has no attribute '{name}'")
  44. def __dir__() -> list[str]:
  45. return sorted(list(__all__) + [__deprecated__]) # pragma: no cover