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

Python调用SQL存储过程4次重试逻辑的报错问题排查

Python 4次循环重试逻辑修复方案

现有代码问题分析

两次代码迭代分别存在以下问题:

  1. 初始版本:str_error仅在try块和except块中赋值,若第一次执行就直接触发异常,str_error还未完成初始化就被if str_error引用,触发UnboundLocalError
  2. 迭代版本:
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:24:07