处理 Python SDK 错误,避免重复求解

作者:solvethree阅读需 1 分钟

连接超时并不能证明任务创建失败。请保留原始任务输入和 requestId,在创建另一次求解前先恢复该请求。

本页内容

分别捕获任务失败和 HTTP 错误

同步 Python SDK 的 solve 方法只创建一次任务,然后持续轮询,直到任务就绪或抛出错误。在捕获 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,以便显式恢复。使用已有的 ID,而不是假定任务从未创建。

示例会打印恢复信息,但不会持久化这些信息,也不会执行恢复。如果集成需要在进程重启后继续运行,请在调用 solve 前保存原始任务输入和请求 ID,然后保留返回的任何任务 ID。对于包含代理凭据的已存储输入,请做好保护。

按任务 ID 继续获取;按请求 ID 恢复创建

  1. 1.

    如果已有 task_id,继续调用 get_task

    获取该任务,而不是再次调用 solve。get_task 接受任务 ID 和 wait_ms 参数;默认等待时间为 15000 毫秒。状态为 pending 或 solving 时继续获取。仅在状态为 ready 时使用解决结果,状态为 failed 时停止。

  2. 2.

    如果创建在收到任务 ID 前中断,重放 create_task

    使用相同的 requestId 发送完全一致的任务输入,必要时使用恢复得到的 request_id。以相同 ID 重放相同请求会返回现有任务;更改输入会产生冲突。获得任务 ID 后,通过 get_task 继续获取。

  3. 3.

    恢复时不要生成新的 ID

    示例在调用 solve 前生成 UUID。恢复时保留该值;不要重新执行任务构造,以免意外替换它。新 ID 代表独立请求,而不是对中断请求的重试。

如果省略 requestId,SDK 会自动生成,并在错误中提供恢复 ID,但绝不会自动重试任务创建。在 solve 期间,对于临时轮询失败,它会在求解截止时间内遵循 Retry-After。如果调用仍然抛出异常,请使用已保存的 ID 继续恢复,而不是开始另一次求解。

恢复不意味着应重复发送无效请求

对于 ApiError,先检查 HTTP 错误,再决定是否重放请求。结果不确定时,适合恢复中断的创建请求;但不应盲目重新发送未更改的无效输入。

对于 TaskFailedError,任务已经结束。获取到的失败任务包含 errorCode 和 error;Python 异常通过 error.error_code 提供错误代码。请据此判断需要更改的内容。例如,site-unreachable 意味着需要调查目标的可达性,而不是假定账户额度不足。失败的求解会退还费用。

运行您的第一个任务。

使用 $5 工作区额度开始体验。

创建工作区
处理 Python SDK 错误,避免重复求解 · solvethree