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

Flask中递归调用函数出现UnboundLocalError错误求助

问题解决:UnboundLocalError 错误修复

错误原因

当try块中的代码抛出异常时,程序进入except块执行递归调用,但没有将递归调用的返回值关联到当前函数的结果,如果递归调用仍然失败,函数最终执行return obj时,obj变量从未被定义过,就会触发UnboundLocalError。

修复方案

1. 递归调用时返回结果

在except块里递归调用函数时,必须返回递归的结果,否则当前函数的返回逻辑会因obj未定义而报错。

2. 限制递归次数

添加重试次数限制,避免因持续异常导致无限递归耗尽服务器资源。

3. 捕获具体异常

不要使用裸except,明确捕获可能出现的异常类型(比如请求异常、KeyError),避免隐藏其他未知错误。

修改后的代码示例

def get_chart_images(dam, chart_name, chart_path, max_retries=3):
    token = _get_token_from_cache(app_config.SCOPE)
    if not token:
        return redirect(url_for("login"))
    
    url = f"https://graph.microsoft.com/v1.0/{chart_path}/Image(width=800,height=600,fittingMode='fit')"
    
    try:
        graph_data = requests.get(
            url,
            headers={'Authorization': f'Bearer {token["access_token"]}'},
        ).json()
        
        return {
            "dam": dam,
            "chart_name": chart_name,
            "chart_image": graph_data["value"]
        }
    except (KeyError, requests.exceptions.RequestException):
        # 还有重试次数时递归调用
        if max_retries > 0:
            return get_chart_images(dam, chart_name, chart_path, max_retries - 1)
        # 重试耗尽后可抛出异常或返回错误标识
        return {"error": "获取图表图片失败"}

说明

  • 直接在try块内返回结果,无需额外定义obj变量,从根源避免变量未定义的问题。
  • 通过max_retries参数控制重试次数,防止无限递归。
  • 精准捕获KeyError(对应graph_data["value"]不存在)和请求相关异常,只处理预期内的错误场景。

内容的提问来源于stack exchange,提问作者Andre Gomes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:20:48