Exception или его подклассов (например, IOError, ValueError).
  
  class DatabaseConnectionError(Exception):
      """Исключение при ошибке подключения к БД."""
      pass
  class APIRequestError(Exception):
      """Исключение при ошибке запроса к API."""
      def __init__(self, status_code, message="API request failed"):
          self.status_code = status_code
          self.message = message
          super().__init__(self.message)
  try:
      # Код, работающий с внешней системой
      raise DatabaseConnectionError("Не удалось подключиться к базе данных.")
  except DatabaseConnectionError as e:
      print(f"Ошибка базы данных: {e}")
  try:
      # код, вызывающий API
      raise APIRequestError(status_code=500, message="Internal Server Error")
  except APIRequestError as e:
      print(f"API Error: Status Code - {e.status_code}, Message - {e.message}")
  При работе с внешними системами, такими как базы данных или веб-сервисы, важно создавать собственные исключения для более точной обработки ошибок и предоставления полезной информации разработчикам. Вот как обычно создаются и используются исключения для таких случаев:
Exception или от его подкласса, например IOError или ValueError.  Этот базовый класс служит корнем для всех остальных исключений, связанных с этой внешней системой.
      
class ExternalServiceError(Exception):
    """Базовое исключение для всех ошибок, связанных с внешней системой."""
    pass
      ExternalServiceError. Эти исключения представляют различные типы ошибок, которые могут возникнуть при взаимодействии с внешней системой (например, ошибка подключения, ошибка авторизации, таймаут запроса, ошибка в данных и т.д.).
      
class DatabaseConnectionError(ExternalServiceError):
    """Ошибка подключения к базе данных."""
    pass
class AuthenticationError(ExternalServiceError):
    """Ошибка аутентификации при обращении к веб-сервису."""
    pass
class RequestTimeoutError(ExternalServiceError):
    """Превышено время ожидания ответа от веб-сервиса."""
    pass
class InvalidDataError(ExternalServiceError):
    """Некорректные данные, полученные от внешней системы."""
    def __init__(self, message, data=None):
        super().__init__(message)
        self.data = data
       Обратите внимание на пример InvalidDataError.  Этот класс принимает дополнительные аргументы, такие как data, которые могут быть полезны для отладки и понимания причины ошибки.
import requests
def get_data_from_api(url):
    try:
        response = requests.get(url, timeout=5)
        response.raise_for_status()  # Raises HTTPError for bad responses (4xx, 5xx)
        return response.json()
    except requests.exceptions.ConnectionError as e:
        raise DatabaseConnectionError(f"Ошибка подключения к API: {e}")
    except requests.exceptions.Timeout:
        raise RequestTimeoutError("Превышено время ожидания ответа от API.")
    except requests.exceptions.HTTPError as e:
        raise AuthenticationError(f"Ошибка аутентификации или доступа к API: {e}")
    except ValueError as e:
        raise InvalidDataError(f"Некорректный формат данных от API: {e}")
    except Exception as e:
        raise ExternalServiceError(f"Неизвестная ошибка при работе с API: {e}")
      В этом примере используется библиотека requests для взаимодействия с веб-сервисом. В блоке try...except обрабатываются различные типы ошибок, которые могут возникнуть при выполнении запроса. Если возникает ошибка, возбуждается соответствующее пользовательское исключение с более информативным сообщением.  Исключения requests.exceptions.ConnectionError, requests.exceptions.Timeout, requests.exceptions.HTTPError и ValueError перехватываются и преобразуются в более конкретные исключения, специфичные для нашего приложения.
Важно! Всегда добавляйте блок except Exception as e: в конце, чтобы перехватить любые непредвиденные исключения и преобразовать их в базовое исключение ExternalServiceError. Это позволит избежать падения программы из-за необработанных ошибок.
try:
    data = get_data_from_api("https://example.com/api/data")
    print(data)
except AuthenticationError as e:
    print(f"Ошибка аутентификации: {e}")
except RequestTimeoutError as e:
    print(f"Превышено время ожидания: {e}")
except ExternalServiceError as e:
    print(f"Произошла ошибка при работе с внешним сервисом: {e}")
      Преимущества использования пользовательских исключений:
Дополнительные рекомендации:
psycopg2 для PostgreSQL, pymongo для MongoDB).