API调用触发ConnectionError时额外出现UnboundLocalError问题排查
问题分析与修复方案
你的函数确实存在异常处理逻辑问题,导致了UnboundLocalError。
问题根源
当断网或其他异常发生时,try块里的response = requests.get(...)代码根本没机会执行——程序直接跳转到对应的except块处理错误。此时response变量完全没被定义,函数最后执行return response.json()时,自然会抛出“局部变量未赋值就引用”的错误。
另外还要纠正两个小问题:
- 类型标注错误:
headers参数应该是dict类型(不是str),因为requests.get的headers需要字典格式 - 返回值标注错误:
response.json()返回的是字典/列表这类JSON结构,不是str
修复方案
这里提供两种常用的修复思路:
方案1:初始化response并在异常时返回默认值
在try块外先把response初始化为None,异常时返回None(或其他你需要的默认值),避免未定义变量的问题:
import requests from typing import Dict, Optional, Any def get_data(url: str, headers: Dict[str, str], timeout_seconds=5) -> Optional[Any]: """从API获取JSON数据,出错时返回None""" response = None try: response = requests.get( url, headers=headers, timeout=timeout_seconds ) response.raise_for_status() return response.json() except requests.exceptions.HTTPError as errh: print("Http Error:", errh) except requests.exceptions.ConnectionError as errc: print("Error Connecting:", errc) except requests.exceptions.Timeout as errt: print("Timeout Error:", errt) except requests.exceptions.RequestException as err: print("Unspecified error:", err) return None
方案2:将return放在try块内,异常时重新抛出
如果希望调用方自己处理异常,可以把return放到try块里,异常打印信息后重新抛出,这样既能保留错误提示,又不会出现变量未定义的问题:
import requests from typing import Dict, Any def get_data(url: str, headers: Dict[str, str], timeout_seconds=5) -> Any: """从API获取JSON数据,出错时抛出异常""" try: response = requests.get( url, headers=headers, timeout=timeout_seconds ) response.raise_for_status() return response.json() except requests.exceptions.HTTPError as errh: print("Http Error:", errh) raise except requests.exceptions.ConnectionError as errc: print("Error Connecting:", errc) raise except requests.exceptions.Timeout as errt: print("Timeout Error:", errt) raise except requests.exceptions.RequestException as err: print("Unspecified error:", err) raise
内容的提问来源于stack exchange,提问作者Jan
相关产品推荐
相关产品推荐

