Обработка ошибок Python SDK без повторного решения задач

Автор: solvethree3 мин на чтение

Тайм-аут соединения не доказывает, что создание задачи не удалось. Сохраните исходные входные данные задачи и requestId; восстановите этот запрос, прежде чем создавать новую задачу решения.

На этой странице

Перехватывайте ошибки задач отдельно от HTTP-ошибок

Метод solve синхронного Python SDK создаёт задачу один раз и опрашивает её до готовности либо возникновения исключения. Перехватывайте конкретные исключения до SolvethreeError, чтобы отличать неуспешное решение от прерванного HTTP-запроса.

Задайте SOLVETHREE_API_KEY и SOLVETHREE_PROXY, затем замените имя хоста и действие из примера значениями целевого сервиса. Для решения на сайте требуется активный профиль рабочего пространства.

Python · различение сбоев и восстановление прерванных запросов
import os
import uuid
from solvethree import Solvethree, ApiError, TaskFailedError, SolvethreeError

client = Solvethree(os.environ["SOLVETHREE_API_KEY"])
task = {"site": "accounts.example.com", "action": "login", "proxy": os.environ["SOLVETHREE_PROXY"], "requestId": str(uuid.uuid4())}
try:
    result = client.solve(task, timeout=180)
    print("Ready task:", result["id"])
    # Submit result["solution"] privately through the target application.
except TaskFailedError as error:
    print("Failed task:", error.task_id, "code:", error.error_code)
    # This task is terminal. Inspect it before starting different work.
except ApiError as error:
    print("HTTP status:", error.status, "retry delay:", error.retry_after)
    print("Recovery IDs:", error.request_id, error.task_id)
    # A known task_id means resume get_task; otherwise replay the exact task
    # with error.request_id. Do not generate a new logical request to recover it.
except SolvethreeError as error:
    print("Recovery IDs:", error.request_id, error.task_id)
    # Save these IDs and the original task inputs for explicit recovery.
  • TaskFailedError: задача перешла в конечный статус failed. Проверьте error.task_id и error.error_code; не продолжайте опрос этой задачи.
  • ApiError: HTTP-запрос завершился ошибкой. Проверьте error.status и error.retry_after, который измеряется в секундах. Это не то же самое, что конечный статус ошибки задачи.
  • SolvethreeError: сохраните error.request_id и error.task_id для явного восстановления. Используйте доступные идентификаторы, а не исходите из того, что задача не была создана.

Пример выводит данные для восстановления, но не сохраняет их и не выполняет восстановление. Если интеграция должна переживать перезапуск процесса, сохраните исходные входные данные задачи и идентификатор запроса перед вызовом solve, а затем сохраняйте любой полученный идентификатор задачи. Защитите сохранённые входные данные, содержащие учётные данные прокси.

Возобновляйте работу по идентификатору задачи; восстанавливайте создание по идентификатору запроса

  1. 1.

    Если есть task_id, возобновите get_task

    Получите эту задачу вместо повторного вызова solve. get_task принимает идентификатор задачи и аргумент wait_ms; время ожидания по умолчанию — 15000 миллисекунд. Продолжайте, пока статус равен pending или solving. Используйте решение только при статусе ready и остановитесь при failed.

  2. 2.

    Если создание прервалось до получения идентификатора задачи, повторите create_task

    Отправьте идентичные входные данные задачи с тем же requestId, при необходимости используя восстановленный request_id. Повторное использование этого идентификатора с тем же запросом возвращает существующую задачу; изменение входных данных вызывает конфликт. Получив её идентификатор, продолжайте с get_task.

  3. 3.

    Не генерируйте новый идентификатор при восстановлении

    Пример генерирует UUID перед вызовом solve. Сохраните это значение для восстановления; не запускайте создание структуры задачи заново, чтобы случайно не заменить его. Новый идентификатор означает отдельный запрос, а не повтор прерванного.

SDK генерирует requestId, если вы его не указали, предоставляет идентификаторы для восстановления в ошибках и никогда не повторяет создание задачи автоматически. Во время solve он учитывает Retry-After при временных сбоях опроса в пределах срока решения. Если вызов всё же завершается исключением, используйте сохранённые идентификаторы для возобновления, а не запускайте новое решение.

Восстановление — не повод повторять некорректные запросы

При ApiError изучите HTTP-ошибку, прежде чем решать, нужно ли что-либо отправлять повторно. Восстановление прерванного создания уместно, когда результат неизвестен; слепая повторная отправка тех же некорректных входных данных — нет.

При TaskFailedError задача завершена. Полученная неуспешная задача содержит errorCode и error; исключение Python предоставляет код через error.error_code. Используйте эти сведения, чтобы решить, что нужно изменить. Например, site-unreachable требует проверки доступности целевого сервиса, а не предположения о нехватке средств на счёте. Средства за неуспешные решения возвращаются.

Запустите первую задачу.

Начните с $5 на балансе рабочего пространства.

Создать рабочее пространство
Обработка ошибок Python SDK без повторного решения задач · solvethree