В каких ситуациях возникает исключение TimeoutError?

«В каких ситуациях возникает исключение TimeoutError?» — вопрос из категории Основы программирования, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

TimeoutError (или аналогичные исключения, связанные с таймаутом) возникает, когда операция не завершается в заданный промежуток времени. Это критически важный механизм для предотвращения зависания программы.

Типичные сценарии:

  1. Сетевые операции: HTTP-запросы, чтение/запись сокетов, подключение к базе данных.
  2. Ожидание в параллельном программировании: Получение результата из Future или Promise, ожидание на блокирующих очередях.
  3. UI-автоматизация: Ожидание появления элемента на странице (например, в Selenium WebDriver).
  4. Долгие вычисления: Выполнение задачи с ограничением по времени.

Примеры на Python:

1. Таймаут HTTP-запроса (библиотека requests):

import requests

try:
    # Таймаут состоит из двух частей: connect и read
    response = requests.get('https://api.example.com/data', timeout=(3.05, 10))
except requests.exceptions.ConnectTimeout:
    print("Ошибка: Не удалось установить соединение за 3.05 секунды.")
except requests.exceptions.ReadTimeout:
    print("Ошибка: Сервер не отправил данные за 10 секунд.")

2. Таймаут при ожидании элемента в Selenium:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException

driver = webdriver.Chrome()
try:
    # Явное ожидание элемента не более 10 секунд
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "dynamic-element"))
    )
except TimeoutException:
    print("Элемент не появился за отведенное время.")

Почему это важно? Корректная обработка таймаутов делает приложение устойчивым к сбоям внешних сервисов и непредсказуемым задержкам.