【问题标题】:Incorporate try except block with python code将 try except 块与 python 代码结合起来
【发布时间】:2018-07-14 05:40:33
【问题描述】:

我正在使用返回键和相应值的多个查询填充电子表格。脚本中使用了两个数据库连接来返回数据。

如果正在执行的 SQL 语句没有问题,则以下代码可以完美运行。如果 SQL 出现问题,程序会因错误而退出,并且我的电子表格不会被填充。

如果出现错误,我仍希望在第一列中填充键并让值返回“0”

棘手的部分是因为有两个服务器连接,一个服务器可能完美地处理 SQL,而另一个可能会抛出异常。

有没有办法可以转换这个代码块来处理它?

我是一个 Python 新手,所以深入研究错误处理有点令人生畏

# Populate the spreadsheet with data from the first set of date ranges.
row = 1
col = 0

for key, value in Queries.query_dic.iteritems():
    cur.execute(value.format(from_dateA,to_dateA))
    cur2.execute(value.format(from_dateA,to_dateA))
    rows = cur.fetchall()
    rows2 = cur2.fetchall()

    # Populate metric being queried in our horizontal headers
    worksheet[index].write(row, col, key, format)
    worksheet[index + 1].write(row, col, key, format)

    # Iterate over the data and write it out row by row.
    for return_count in rows:
        worksheet[index].write(row, col + 1, return_count[0], format2)

    for return_count in rows2:
        worksheet[index + 1].write(row, col + 1, return_count[0], format2)

    row += 1

【问题讨论】:

  • 哪个语句抛出错误?属于哪一种?
  • 好吧,例如,如果 SQL 中有错误的语法,它将引发错误。我不确定这是否发生在 cur.execute 语句或 cur.fetchall()

标签: python linux exception try-except


【解决方案1】:

经过反复试验,我找到了可行的解决方案。

# Print metric headers and counts for first date range.
row = 1
col = 0

for key, value in Queries.query_dic.iteritems():

    # Write the metrics headers
    worksheet[index].write(row, col, key, format)
    worksheet[index + 1].write(row, col, key, format)

    # Populate spreadsheet with count returned from query for Environment 1. 
    try:
        cur.execute(value.format(from_dateA,to_dateA))
        rows = cur.fetchall()
        for return_count in rows:
            worksheet[index].write(row, col + 1, return_count[0], format2)
    # Query will fail if module doesn't exist; in this case print '0'.
    except:
        worksheet[index].write(row, col + 1, '0', format2)

    # Populate spreadsheet with count returned from query for Environment 2. 
    try:
        cur2.execute(value.format(from_dateA,to_dateA))
        rows = cur2.fetchall()
        for return_count in rows:
            worksheet[index + 1].write(row, col + 1, return_count[0], format2)
    # Query will fail if module doesn't exist; in this case print '0'.
    except:
        worksheet[index + 1].write(row, col + 1, '0', format2)

    row += 1

【讨论】:

    【解决方案2】:

    要使用 try-except 你可以这样做

    try:
        for key, value in Queries.query_dic.iteritems():
            cur.execute(value.format(from_dateA,to_dateA))
            cur2.execute(value.format(from_dateA,to_dateA))
            rows = cur.fetchall()
            rows2 = cur2.fetchall()
    
            # Populate metric being queried in our horizontal headers
            worksheet[index].write(row, col, key, format)
            worksheet[index + 1].write(row, col, key, format)
    
            # Iterate over the data and write it out row by row.
            for return_count in rows:
                worksheet[index].write(row, col + 1, return_count[0], format2)
    
            for return_count in rows2:
                worksheet[index + 1].write(row, col + 1, return_count[0], format2)
    
            row += 1
    except:
        # Error Handling
    

    如果你想有特定于错误的处理,你可以简单地将错误放在 except 之后

    except KeyboardInterrupt:
        # Error Handling
    

    【讨论】:

    • 这里的问题是,由于我要连接两台服务器,因此查询可能适用于一台服务器,而另一台则不行。使用此代码,如果一台服务器“中断”,即使另一台服务器可以完美处理 SQL,它也会抛出异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多