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
相关产品推荐
相关产品推荐

