【问题标题】:Loop to run 4 times to try run a SQL procedure, after 4 attempts then stop循环运行 4 次尝试运行 SQL 过程,尝试 4 次后停止
【发布时间】:2021-10-06 10:57:24
【问题描述】:

我尝试在 python 中编写一些代码来执行 4 次循环。它将失败,因为spTest 不存在。所以我想再次尝试循环(总共重复 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

def test():
    for x in range(0, 4):  # try 4 times
        try:
            df = pd.read_sql(sql='EXEC [prod].[spTest]', con=engine, )
            str_error = None
        except Exception as str_error:
            print(str_error)
            pass

        if str_error:
            sleep(2)  # wait for 2 seconds before trying to fetch the data again
        else:
            break

    print(df)

我得到的错误:

if str_error: 
  UnboundLocalError: local variable 'str_error' referenced before assignment

更新代码:

def test():
    str_error = None
    for x in range(0, 4):  # try 4 times
        try:
            df = pd.read_sql(sql='EXEC [prod].[spTest]', con=engine, )
        except Exception as str_error:
            print(str_error)

        if str_error:
            sleep(2)
        else:
            break

        print(df)

问题:不再循环 4 次。

【问题讨论】:

  • 我实际上发现它很有趣,为什么即使在做了except Exception as str_error 之后还有NameError 并询问了follow-up question 这个问题

标签: python pandas dataframe


【解决方案1】:

为什么需要一个单独的条件来检查错误是否发生?这正是try/except 的用途:

for x in range(4):  # try 4 times
    try:
        df = pd.read_sql(sql='EXEC [prod].[spTest]', con=engine, )
        break
    except Exception as str_error:
        print(str_error)
        sleep(2)  # wait for 2 seconds before trying to fetch the data again

【讨论】:

    【解决方案2】:

    错误告诉您问题所在 - str_error 没有分配任何值。

    如果您确实需要 str_error 之外的 try except,则应将其编辑为:

    str_error = None
    
    try:
        df = pd.read_sql(sql='EXEC [prod].[spTest]', con=engine, )
    except Exception as error:
        str_error = error
        print(error)
    
    if str_error != None:
        sleep(2)
    else:
        break
    

    【讨论】:

    • 我已经尝试过了,它不再抱怨 str_error,但是它不再执行 4 次循环。请参阅上面更新的问题
    • 我已经编辑了答案,现在应该可以解决这两个问题
    猜你喜欢
    • 2013-10-07
    • 2020-07-13
    • 1970-01-01
    • 1970-01-01
    • 2021-03-19
    • 2015-05-17
    • 2018-10-21
    • 2018-05-28
    • 1970-01-01
    相关资源
    最近更新 更多