Что такое ошибка ConnectionError?

Ошибка ConnectionError: Failed to establish connection возникает, когда Python не может установить сетевое соединение с удаленным сервером или сервисом.

Причины возникновения

  • Сервер недоступен или не отвечает
  • Проблемы с сетевым подключением
  • Неправильный URL или endpoint
  • Блокировка файрволом
  • Проблемы с DNS
  • Превышение таймаута

Как отладить ошибку

  1. Проверь сетевое подключение - используй ping или curl
  2. Проверь URL/endpoint - убедись в правильности адреса
  3. Проверь настройки файрвола - убедись в отсутствии блокировки
  4. Протестируй с curl или Postman - для изоляции проблемы

Как исправить ошибку

1. Добавь логику повторных попыток с экспоненциальной задержкой

 1import requests
 2import time
 3from requests.adapters import HTTPAdapter
 4from urllib3.util.retry import Retry
 5
 6session = requests.Session()
 7retry = Retry(
 8    total=3,
 9    backoff_factor=0.5,
10    status_forcelist=[500, 502, 503, 504]
11)
12adapter = HTTPAdapter(max_retries=retry)
13session.mount('http://', adapter)
14session.mount('https://', adapter)
15
16try:
17    response = session.get('https://api.example.com')
18except requests.ConnectionError:
19    print("Не удалось подключиться к серверу")

2. Проверь конфигурацию сети

1import socket
2
3def check_connection(host, port):
4    try:
5        socket.create_connection((host, port), timeout=5)
6        return True
7    except OSError:
8        return False

3. Используй connection pooling

 1import requests
 2
 3# Используй сессию для переиспользования соединений
 4session = requests.Session()
 5
 6# Настрой connection pooling
 7session.mount('https://', requests.adapters.HTTPAdapter(
 8    pool_connections=10,
 9    pool_maxsize=20
10))

4. Правильно обрабатывай таймауты

 1import requests
 2
 3try:
 4    response = requests.get(
 5        'https://api.example.com',
 6        timeout=(5, 30)  # (connect_timeout, read_timeout)
 7    )
 8except requests.ConnectTimeout:
 9    print("Таймаут подключения")
10except requests.ReadTimeout:
11    print("Таймаут чтения")

Как мониторить подобные ошибки

  • Настрой мониторинг доступности сервисов
  • Используй health checks для проверки состояния
  • Отслеживай частоту и паттерны ошибок
  • Используй инструменты мониторинга (Prometheus, Grafana, ELK stack)

FAQ

В: Как проверить доступность сервера?

О: Используй ping, telnet или curl для проверки доступности.

В: Что делать при проблемах с DNS?

О: Проверь настройки DNS, используй IP-адрес напрямую или настрой альтернативные DNS-серверы.

В: Как настроить прокси для запросов?

О: Используй параметр proxies в requests: requests.get(url, proxies={'http': 'proxy_url'}).

Лучшие практики

  • Всегда используй таймауты для сетевых запросов
  • Реализуй логику повторных попыток с экспоненциальной задержкой
  • Используй connection pooling для оптимизации
  • Обрабатывай различные типы сетевых ошибок
  • Мониторь доступность внешних сервисов