You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何isinstance对同类型Google API异常类判断失效?

Google Python SDK重试策略函数异常结果原因解析

问题背景

根据Google重试策略编写了如下重试判断代码:

from google.api_core import exceptions
from google.api_core.retry import Retry

_MY_RETRIABLE_TYPES = (
   exceptions.TooManyRequests,  # 429
   exceptions.InternalServerError,  # 500
   exceptions.BadGateway,  # 502
   exceptions.ServiceUnavailable,  # 503
)

def is_retryable(exc):
    return isinstance(exc, _MY_RETRIABLE_TYPES)

my_retry_policy = Retry(predicate=is_retryable)

但测试时得到以下不符合预期的结果:

exceptions.TooManyRequests==exceptions.TooManyRequests -> True
is_retryable(exceptions.TooManyRequests) -> False 
is_retryable(429) -> False 
is_retryable(exceptions.TooManyRequests.code) -> False
is_retryable(exceptions.TooManyRequests.code.value) -> False 

原因分析

所有测试失败的核心是传参类型与isinstance()函数要求不匹配:

  • is_retryable(exceptions.TooManyRequests)返回False:
    exceptions.TooManyRequests是异常类本身,而isinstance()的第一个参数必须是类的实例对象,不是类。正确的传参应该是创建实例:is_retryable(exceptions.TooManyRequests())。

  • 其余测试(传入429、code枚举等)返回False:
    这些参数是数字、枚举类或枚举值,完全不属于_MY_RETRIABLE_TYPES定义的异常类实例范畴,isinstance()自然返回False。

正确测试示例

# 创建异常实例后传入测试
test_exc = exceptions.TooManyRequests("test error")
print(is_retryable(test_exc))  # 输出True

你的is_retryable函数逻辑本身是符合Google Retry要求的——它接收抛出的异常实例作为参数,只是测试时传错了参数类型。

内容的提问来源于stack exchange,提问作者dataviews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 09:05:18