Python requests请求返回429状态码时应抛出哪种合适的错误?
requests库429状态码错误处理方案
内置错误类型选择
requests库已经内置了requests.HTTPError类,专门用于抛出HTTP响应层面的错误,完全适配429(请求频率过高)这类场景,比通用的Exception、ValueError更符合语义。
常用处理方案
方案1:直接使用内置HTTPError(适配大多数场景)
你可以手动判断429状态码后抛出该异常,还可以传入响应对象方便上层捕获后获取Retry-After等响应头信息,示例代码如下:
import requests response = requests.request('GET', url) if response.status_code == 200: # 处理正常响应逻辑 pass elif response.status_code == 429: raise requests.HTTPError( 'You made too many requests, please wait a minute and then try again', response=response )
如果你需要统一处理所有4xx、5xx类的HTTP错误,不需要单独判断429,直接调用内置方法即可:
response = requests.request('GET', url) response.raise_for_status() # 所有非2xx类状态码都会自动抛出对应描述的HTTPError
方案2:自定义异常类(适合需要单独捕获429做特殊处理的场景)
如果你的上层逻辑需要单独区分429错误做重试、限流提示等特殊处理,可以自定义继承自requests.HTTPError的异常类,语义更清晰:
import requests class TooManyRequestsError(requests.HTTPError): """请求频率超出限制,对应HTTP 429状态码""" pass response = requests.request('GET', url) if response.status_code == 200: pass elif response.status_code == 429: raise TooManyRequestsError( 'You made too many requests, please wait a minute and then try again', response=response )
异常捕获示例
上层捕获时可以根据需求选择捕获粒度:
import time try: # 发送请求的逻辑 send_request() except TooManyRequestsError as e: # 单独处理429错误:比如读取Retry-After头等待后重试 retry_after = int(e.response.headers.get('Retry-After', 60)) time.sleep(retry_after) send_request() except requests.HTTPError as e: # 处理其他HTTP错误 print(f"HTTP请求错误:{e}")
内容的提问来源于stack exchange,提问作者codeananda
相关产品推荐
相关产品推荐

