处理 Python SDK 错误,避免重复求解
连接超时并不能证明任务创建失败。请保留原始任务输入和 requestId,在创建另一次求解前先恢复该请求。
本页内容
分别捕获任务失败和 HTTP 错误
同步 Python SDK 的 solve 方法只创建一次任务,然后持续轮询,直到任务就绪或抛出错误。在捕获 SolvethreeError 前先捕获具体异常,以区分求解失败和 HTTP 请求中断。
设置 SOLVETHREE_API_KEY 和 SOLVETHREE_PROXY,然后将示例主机名和操作替换为目标值。站点需要具备有效的工作区配置,才能进行求解。
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.
如果已有 task_id,继续调用 get_task
获取该任务,而不是再次调用
solve。get_task接受任务 ID 和wait_ms参数;默认等待时间为 15000 毫秒。状态为pending或solving时继续获取。仅在状态为ready时使用解决结果,状态为failed时停止。 - 2.
如果创建在收到任务 ID 前中断,重放 create_task
使用相同的
requestId发送完全一致的任务输入,必要时使用恢复得到的request_id。以相同 ID 重放相同请求会返回现有任务;更改输入会产生冲突。获得任务 ID 后,通过get_task继续获取。 - 3.
恢复时不要生成新的 ID
示例在调用
solve前生成 UUID。恢复时保留该值;不要重新执行任务构造,以免意外替换它。新 ID 代表独立请求,而不是对中断请求的重试。
如果省略 requestId,SDK 会自动生成,并在错误中提供恢复 ID,但绝不会自动重试任务创建。在 solve 期间,对于临时轮询失败,它会在求解截止时间内遵循 Retry-After。如果调用仍然抛出异常,请使用已保存的 ID 继续恢复,而不是开始另一次求解。
恢复不意味着应重复发送无效请求
对于 ApiError,先检查 HTTP 错误,再决定是否重放请求。结果不确定时,适合恢复中断的创建请求;但不应盲目重新发送未更改的无效输入。
对于 TaskFailedError,任务已经结束。获取到的失败任务包含 errorCode 和 error;Python 异常通过 error.error_code 提供错误代码。请据此判断需要更改的内容。例如,site-unreachable 意味着需要调查目标的可达性,而不是假定账户额度不足。失败的求解会退还费用。
来源与 API 参考
运行您的第一个任务。
使用 $5 工作区额度开始体验。