Python调用SQL存储过程4次重试逻辑的报错问题排查
Python 4次循环重试逻辑修复方案
现有代码问题分析
两次代码迭代分别存在以下问题:
- 初始版本:
str_error仅在try块和except块中赋值,若第一次执行就直接触发异常,str_error还未完成初始化就被if str_error引用,触发UnboundLocalError - 迭代版本:
str_error仅在函数开头初始化一次,若某次循环执行成功,不会修改str_error的历史异常值,导致逻辑判断错误- 执行失败时
df未被初始化,循环末尾的print(df)会触发NameError直接终止程序,无法完成后续重试 - 没有最终重试失败的抛出逻辑,不符合累计4次失败抛出错误的需求
修复后完整代码
import traceback import urllib from datetime import datetime import numpy as np import pandas as pd import sqlalchemy as db from sqlalchemy import event import logging from tqdm import tqdm import smtplib import ssl from time import sleep # 此处需替换为实际的数据库连接串初始化engine engine = db.create_engine("database_connection_string") def test(): df = None max_retry = 4 last_error = None for retry_cnt in range(max_retry): try: df = pd.read_sql(sql='EXEC [prod].[spTest]', con=engine) # 执行成功直接跳出重试循环 break except Exception as e: last_error = e print(f"第{retry_cnt + 1}次调用失败,错误信息:{str(e)}") # 非最后一次重试时等待2秒 if retry_cnt < max_retry - 1: sleep(2) # 全部重试失败则抛出异常 if df is None: raise RuntimeError(f"累计重试{max_retry}次,调用存储过程spTest仍失败") from last_error print(df) return df if __name__ == "__main__": test()
核心修复点说明
- 提前初始化
df和异常记录变量,避免变量未定义的运行时错误 - 每次循环独立处理异常逻辑,不受上一次执行结果干扰
- 优化休眠逻辑,最后一次重试失败无需额外等待
- 增加最终失败校验,重试耗尽后主动抛出异常,同时保留原始错误栈方便问题排查
- 重试次数使用变量配置,后续调整重试次数更便捷
内容的提问来源于stack exchange,提问作者RA19
相关产品推荐
相关产品推荐

