2 Try / Except语句不按正常顺序工作,但在翻转代码时有效

时间:2014-09-04 10:00:20

标签: python try-catch mysql-python except

大家好,我希望能得到一些建议。我似乎不能按照我想要的顺序运行这个2 TRY / EXCEPT语句。但是,如果我先将STEP2放在STEP1之后,它们会很有效。

此当前代码仅打印出来。

Transferred: x rows.

如果翻转,则会同时打印。

Unfetched: x rows.
Transferred: x rows.

我试过了:

  • 根据示例分配单独的cur.close()和db.commit() here,也没有工作。 (附带问题:我应该关闭/提交 然而他们个别?这是一般的良好做法还是 基于上下文的?)

  • 对第2步使用cur.rowcount方法以及我认为可能是 问题出在SQL方面,但问题仍然存在。

  • 搜索了SO并且找不到任何类似的案例。

在Python 2.7上运行。代码:

import MySQLdb
import os

#Initiate connection to database.
db = MySQLdb.connect(host="localhost",user="AAA",passwd="LETMEINYO",db="sandbox")
cur = db.cursor()

#Declare variables.
viewvalue = "1"

mainreplace =   (
                    "INSERT INTO datalog "
                    "SELECT * FROM cachelog WHERE viewcount = %s; "
                    "DELETE FROM cachelog WHERE viewcount = %s; "
                    % (viewvalue, viewvalue)
                )

balance =   (
                "SELECT COUNT(*) FROM cachelog "
                "WHERE viewcount > 1"
            )

#STEP 1: Copy and delete old data then print results.
try:
    cur.execute(mainreplace)
    transferred = cur.rowcount
    print "Transferred: %s rows." %(transferred)
except:
    pass

#STEP 2: Check for unfetched data and print results.
try:
    cur.execute(balance)
    unfetched = cur.fetchone()
    print "Unfetched: %s rows." % (unfetched)
except:
    pass

#Confirm and close connection.
cur.close()
db.commit()
db.close()

原谅我的任何非Pythonic方式,因为我仍然是一个非常初学者。非常感谢任何建议,谢谢!

1 个答案:

答案 0 :(得分:1)

你有两个明显的非Pythonic代码:使用一个裸except:而不说你想要捕获哪个异常,并使用pass除了阻止所以异常完全被忽略!

像这样的代码的问题是,如果出现问题,你将永远不会看到错误信息,所以你无法找出错误。

问题可能是你的“mainreplace”查询删除了“cachelog”表中的所有内容,因此在它没有行之后的“balance”查询,因此fetchone()失败,抛出异常以及它后面的行从未被执行过。或者也许是完全不同的东西,很难从这里说出来。

如果你没有那个尝试/除了那里,你会得到一个很好的错误信息,你不必问这个问题。