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

Python如何实现排除指定异常列表、其余所有异常均触发重试?

实现方案

核心逻辑

只需要在重试判断时,排除ValueError类型即可:捕获到异常后如果类型是ValueError就直接终止流程抛出异常,其余所有异常都触发重试逻辑。
下面提供两种常用实现方式:

方案1:使用第三方重试库tenacity(推荐,支持自定义重试间隔、退避策略等扩展能力)

首先安装依赖:
pip install tenacity
代码示例:

from tenacity import retry, stop_after_attempt, wait_exponential, retry_if_not_exception_type
import google.oauth2.service_account as service_account

class YourClass:
    # 这里配置重试规则:最多重试3次,指数退避间隔,除了ValueError外所有异常都重试
    @retry(
        stop=stop_after_attempt(3),
        wait=wait_exponential(multiplier=1, min=2, max=10),
        retry=retry_if_not_exception_type(ValueError)
    )
    def get_google_credentials(self, google_creds_dict):        
        SCOPES = [
            'https://www.googleapis.com/auth/drive.readonly',
            'https://www.googleapis.com/auth/drive.file',
            'https://www.googleapis.com/auth/spreadsheets',
        ]
        
        credentials = service_account.Credentials.from_service_account_info(google_creds_dict, scopes=SCOPES)
        
        return credentials

参数说明:

  • stop_after_attempt(3):最多重试3次,超过次数后抛出原始异常
  • wait_exponential:指数退避的等待间隔,示例中首次重试等2秒,第二次4秒,第三次最多10秒,避免短时间内频繁请求触发限流
  • retry_if_not_exception_type(ValueError):核心配置,只要抛出的异常不是ValueError就触发重试

方案2:手动实现重试逻辑(无第三方依赖)

如果不想引入额外依赖,可以自己实现简单的重试逻辑:

import google.oauth2.service_account as service_account

class YourClass:
    def get_google_credentials(self, google_creds_dict, max_retry=3):        
        SCOPES = [
            'https://www.googleapis.com/auth/drive.readonly',
            'https://www.googleapis.com/auth/drive.file',
            'https://www.googleapis.com/auth/spreadsheets',
        ]
        retry_count = 0
        while retry_count < max_retry:
            try:
                credentials = service_account.Credentials.from_service_account_info(google_creds_dict, scopes=SCOPES)
                return credentials
            except ValueError as e:
                # 遇到ValueError直接抛出不重试
                raise e
            except Exception as e:
                # 其他异常重试,每次等待2秒
                retry_count += 1
                if retry_count >= max_retry:
                    raise e
                import time
                time.sleep(2)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 01:09:01