Skip to content

错误处理

异常

python
from qirabot import (
    Qirabot,
    QirabotError,              # 基类
    AuthenticationError,       # API key 无效
    InsufficientBalanceError,  # 积分不足
    QirabotTimeoutError,       # wait_for / 自动等待超时
)

try:
    # 构造函数本身就可能抛异常:它会校验 API key 并向服务器注册任务。
    # `with` 保证 close() 在——且仅在——构造成功时执行。
    with Qirabot() as bot:
        page = bot.open("https://example.com")
        bot.click(page, "登录按钮")
except AuthenticationError:
    print("API key 无效。")
except InsufficientBalanceError:
    print("积分不足。")
except QirabotTimeoutError:
    print("操作超时。")
except QirabotError as e:
    print(f"错误: {e}")

完整体系——所有异常都派生自 QirabotError,所以单独一个 except QirabotError 永远是安全的兜底:

异常时机
AuthenticationErrorAPI key 缺失或无效(401)。不重试。
InsufficientBalanceError积分余额耗尽(402)。不重试。
RateLimitError请求过多(429)。SDK 内部会退避并重试;捕获它可加自己的退避策略。
QirabotTimeoutError客户端等待超时(wait_for、自动等待)。
QirabotConnectionError服务器不可达(DNS 解析失败、连接被拒)——请求根本没有完成,而不是慢。
TaskTerminatedError脚本还在运行时任务被服务端终止(控制台停止、孤儿清理器、最长时长上限)。.task_status 携带终态。不重试。
ActionErrorAI 动作在服务端执行失败。
MissingDependencyError某个可选后端依赖(playwright、pyautogui 等)未安装——消息里给出要执行的确切 pip install "qirabot[<extra>]"。同时也是 ImportError

verify() 是"失败即抛异常"语义的刻意例外:断言不成立不抛异常—— 返回 falsy 结果(VerifyResult,其 .reason 说明原因),可直接用于 assertif。传输和服务器错误(连接丢失、鉴权、终止)仍像其他调用 一样抛出。

瞬时的动作失败会自动重试(默认 retry=1retry_delay=1.0——见 配置)。

ai() 运行如何结束:result.status

result.success 是二值判定,但失败的运行可能意味着很不一样的事情:

status含义success
"completed"模型判定目标已达成True
"goal_failed"模型判定目标不可达(登录墙、验证码)False
"max_steps"步数预算用尽——是截断,不是能力判定False
"error"服务器报告终止性错误False

max_steps 值得专门处理——它是预算问题,不是能力问题:

python
result = bot.ai(page, "找到最便宜的航班并锁定")
if result.status == "max_steps":
    # 不是真的失败——预算太小;加大步数重试
    result = bot.ai(page, "找到最便宜的航班并锁定", max_steps=50)

goal_failed 通常意味着环境需要帮助——登录墙或验证码。可以考虑 人工介入的自定义工具, 让模型求助而不是放弃。

失败在报告中的呈现

以抛异常结束的运行不会产生 RunResult;在 HTML 报告 里对应区块的徽章是 ERROR。报告在异常和 Ctrl+C 之后也会写出,包含 直到失败为止的逐步截图——通常是看清屏幕上到底发生了什么的最快方式。

报告头部的汇总:全部通过为绿色,只有 MAX STEPS 截断为琥珀色,存在真正 失败为红色。

自定义工具的错误

自定义工具抛异常不会杀死运行:异常以 ERROR: ... 回报给模型,模型可以 应对——重试、换路径,或以 goal_failed 结束。见 AI 任务与自定义工具

基于 MIT 许可证发布。