如何在Python中捕获OpenAI API的所有5xx错误以实现重试?
捕获OpenAI API所有5xx错误并重试的实现方案
OpenAI Python SDK中,所有API相关异常都继承自OpenAIError基类,且这类异常实例都会携带status_code属性,我们可以利用这一点精准判断5xx错误。调整你的代码逻辑如下:
from openai import OpenAIError, InvalidRequestError def call_openai_api(req, max_retries=3): current_retry = 0 while current_retry < max_retries: try: response = openai.ChatCompletion.create(req) return response except InvalidRequestError as e: # 4xx类请求无效错误,重试无意义,直接上报 reportError(e) raise except OpenAIError as e: # 捕获所有OpenAI API异常,判断是否为5xx状态码 if 500 <= getattr(e, 'status_code', 0) < 600: current_retry += 1 # 执行重试逻辑,可加入间隔等待避免频繁请求 retry() continue # 非5xx的API错误,按需上报或处理 reportError(e) raise except Exception as e: error_msg = f"Exception: {e}" reportError(error_msg) raise Exception(error_msg) # 达到最大重试次数仍失败,上报并抛出 reportError("Max retries reached for 5xx errors") raise Exception("Max retries reached")
关键细节:
- 优先捕获
InvalidRequestError:这类属于客户端请求错误(如参数非法、权限不足),对应4xx状态码,重试无法解决,直接上报即可。 - 通过
OpenAIError基类兜底所有API异常,用status_code判断是否在500-599区间,触发重试逻辑。 - 加入
max_retries限制重试次数,避免无限循环,实际使用中可搭配time.sleep()增加重试间隔,降低服务器压力。 - 用
getattr(e, 'status_code', 0)做兼容处理,防止部分异常实例未携带状态码导致报错。
内容的提问来源于stack exchange,提问作者reika
相关产品推荐
相关产品推荐

