You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:07