Python调用Spotify API返回404错误 异常捕获跳过失效解决方法
核心原因
裸except捕获失效基本是两个原因:
- 你用的Spotify请求SDK(最常见的是spotipy)默认不会将404类HTTP错误抛出为顶层异常,错误在SDK内部被处理后仅打印日志,不会走到外层
except分支 - 异常触发点在
merge_info函数内部被提前捕获吞掉,没有向外层抛出
可行方案
不要等异常被动触发,主动做多层校验,稳定性更高:
- 第一层:在请求返回后第一时间校验HTTP状态码,遇到404直接返回空值跳过,不进入后续解析逻辑
- 第二层:针对性捕获对应SDK/请求库的指定异常类型,不要用无差别的裸
except,避免吞掉关键系统级错误 - 第三层:对查询参数做预处理,把参数里的HTML转义字符比如
&替换为原生&,减少因参数格式错误触发的无效404
代码参考
如果是直接用requests库写请求逻辑,按如下方式修改:
import requests from requests.exceptions import HTTPError def merge_info(album_name): # 原有参数构造逻辑,新增转义字符替换 search_q = f'album:{album_name}'.replace('&', '&') req_params = { 'q': search_q, 'limit': 10, 'offset': 0, 'type': 'album', 'market': None } resp = requests.get( "https://api.spotify.com/v1/search", params=req_params, headers={"Authorization": f"Bearer {你的access_token}"} ) # 主动判断404,直接返回空 if resp.status_code == 404: print(f"[跳过] 未找到专辑:{album_name}") return None # 其他HTTP错误主动抛出 resp.raise_for_status() # 原有专辑信息解析、合并逻辑 return parsed_result rows = [] for album_1 in all_albums: try: album_info = merge_info(album_1) if album_info: rows.append(album_info) except HTTPError as e: print(f"[跳过] 请求专辑{album_1}出错:{str(e)}") continue
如果是用官方spotipySDK,注意捕获SDK自定义异常:
import spotipy from spotipy.exceptions import SpotifyException # 初始化客户端时不要开启静默错误模式 sp = spotipy.Spotify(auth_manager=你的鉴权实例) rows = [] for album_1 in all_albums: try: search_res = sp.search( q=f'album:{album_1}'.replace('&', '&'), type='album', limit=10, offset=0 ) rows.append(merge_info(search_res)) except SpotifyException as e: if e.http_status == 404: print(f"[跳过] 未找到专辑:{album_1}") continue print(f"[跳过] 请求专辑{album_1}异常:{str(e)}")
补充说明:裸
except会捕获包括KeyboardInterrupt、MemoryError在内的所有系统级异常,排查问题时会完全看不到报错栈,生产场景下禁止使用。
内容的提问来源于stack exchange,提问作者Lucas cantu
相关产品推荐
相关产品推荐

