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
相关产品推荐
相关产品推荐

