
Fli错误处理与重试最佳实践类型化异常、限流与指数退避完全指南【免费下载链接】fliGoogle Flights MCP, CLI and Python Library项目地址: https://gitcode.com/gh_mirrors/fli2/flifli是一个 Google Flights 航班搜索工具提供 Python 库、CLI 命令和 MCP 服务三种使用方式。本文带你快速掌握它的错误处理与重试机制内置的类型化异常、10 次/秒的限流保护、带指数退避的自动重试以及如何给批量搜索加上健壮的重试层。为什么搜索航班会出错航班搜索走的是真实的 Google Flights 网络请求会遇到三类典型问题网络抖动超时、DNS 解析失败、连接被重置服务端拒绝限流HTTP 429、服务端 5xx、请求被 RPC 层拒绝环境差异企业代理的 TLS 证书拦截、欧盟地区的同意页拦截。好消息是fli 已经把这些坑全部踩过并内置了对策你只需要知道每种错误能不能重试就够了。类型化异常7 种错误一眼看懂fli 把所有搜索失败封装成一个清晰的异常家族源码见 fli/search/exceptions.py以SearchClientError为基类异常类型含义能重试吗SearchTimeoutError请求超时✅ 能SearchConnectionError网络/DNS 问题✅ 能SearchCertificateErrorTLS 证书校验失败❌ 先修证书SearchHTTPError非 2xx 响应带status_code⚠️ 429/5xx 能SearchRejectedErrorGoogle 返回 200 但拒绝出数据带 gRPC 错误码❌ 重试无用SearchParseError页面解析失败常见于同意页❌ 需先处理环境SearchUnsupportedError当前传输层不支持该查询❌ 需改查询每个异常都是轻量包装原始底层异常通过__cause__保留方便排查日志而用户看到的只有可读性很强的一句话提示。内置限流与指数退避不用你写一行代码打开 fli/search/client.py你会看到三层保险 全局令牌桶限流Client在每次 HTTP 请求前先向线程安全的TokenBucketRateLimiter领一个令牌全局预算是10 次请求/秒对齐 Google 的公开上限。即使你开 10 个线程并行搜索总流量也不会超限——实现细节在 fli/search/_concurrency.py。 自动重试 指数退避get/post方法都挂着 tenacity 重试装饰器最多 3 次尝试等待时间按指数退避递增。 聪明地不重试唯一被排除在重试之外的是SearchCertificateError证书问题对固定环境是确定性失败重试 3 次只会白白浪费用户时间不如立即抛出并提示你设置FLI_CA_BUNDLE。统一错误分类error_type 与 retryable无论你是用 CLI 还是 MCP 调用 fli同一个异常永远得到同一套机器可读分类error_typeretryable 可选的http_status。分类器classify_error位于 fli/core/errors.py被 CLI 的 JSON 输出和 MCP 服务器fli/mcp/server.py共用两边永远不会各说各话。对 AI Agent 来说这是关键能力——MCP 工具报错时直接告诉你该不该重试官方给出的重试守则见 fli/core/errors.py 模块文档客户端内部已经退避重试过 3 次才抛出异常。如果你收到retryable: true最多再重试 1~2 次用自己的指数退避以秒为单位别用毫秒如果http_status是 429说明 Google 明确在喊慢点——退避要更长而不是更短。CLI 的友好报错与日志文件用 CLI 时fli/cli/errors.py 会把丑陋的 traceback 变成一行红色友好提示按异常类型给出不同措辞超时/证书/网络/被拒绝……完整日志文件写入~/.fli/logs/带微秒级时间戳包含命令、参数和完整堆栈方便事后排查。加--format json时错误也变成结构化输出message、error_type、retryable、http_status、log_path五个字段脚本可以直接消费。实践给批量搜索加上自己的重试层内置重试解决单次请求问题如果你的程序会连续搜几十条航线比如价格监控建议在业务层再加一层退避重试。仓库自带示例 examples/python/error_handling_with_retries.py核心就一行装饰器retry(stopstop_after_attempt(5), waitwait_exponential(multiplier1, min4, max60)) def search_with_retry(filters): return SearchFlights().search(filters)三个实用建议✅ 空结果 ≠ 错误先判断真没航班还是请求被拒后者会抛SearchRejectedError✅ 按异常类型分支处理timeout/connection_error重试rejected_error/validation_error改参数❌ 不要对retryable: false的错误盲目重试——那只会加重对方负担。环境变量速查变量作用FLI_TIMEOUT覆盖请求超时默认 60 秒FLI_SOCS_COOKIE欧盟/EEA 用户跳过 Google 同意页解决parse_errorFLI_CA_BUNDLE指向企业代理的 CA 证书包解决certificate_error最佳实践清单 用isinstance按类型而非消息文本判断错误消息措辞可能变化重试只看retryable字段且额外重试 ≤ 2 次、秒级指数退避429 出现后主动降低并发别硬扛限流环境类错误证书/同意页优先改环境变量而不是加重试完整错误堆栈交给日志文件控制台只留一行可读提示。掌握这套类型化异常 限流 指数退避的组合拳你的航班搜索程序在真实网络环境下就能稳如老狗了。【免费下载链接】fliGoogle Flights MCP, CLI and Python Library项目地址: https://gitcode.com/gh_mirrors/fli2/fli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考