Python初学者:如何防止“finally”执行?

2024-05-18 21:41:25 发布

您现在位置:Python中文网/ 问答频道 /正文

功能代码:

# Connect to the DB
try:
    dbi = MySQLdb.connect(host='localhost', \
                          user='user', \
                          passwd='pass', \
                          db='dbname', \
                          port=3309)

    print "Connected to DB ..."

except MySQLdb.Error, e:
    apiErr = 2
    apiErrMsg = "Error %d: %s" % (e.args[0], e.args[1])
    return

    # To prevent try..finally bug in python2.4,
    # one has to nest the "try: except:" part. 
try:
    try:
        sql = dbi.cursor()
        sql.execute("""
        SELECT *
        FROM table
        WHERE idClient =  %s
        """, (key, ))

        access = sql.fetchall()

        # [some more code here]           

    except MySQLdb.Error, e:
        apiErr = 2
        apiErrMsg = "Error %d: %s" % (e.args[0], e.args[1])
        return

finally:
    sql.close()
    dbi.close()

我可以理解。。除了。。最后,finally块将始终执行。 在上面的代码中,如果第一个try块中出现异常,我不希望执行第二个try块中的finally。我做错什么了?在

(注意:使用Python2.4)

如果mysqlan connections自动关闭,则mysqlan connections将自动关闭。我在上面代码中遇到的问题是,当建立连接(代码的第一个try块)时出错时,调用dbi.关闭finally块中的()引用dbi引发“AttributeError:'NoneType'object没有属性'close'”。。。在

解决方案: 这一切如愿以偿-

^{pr2}$

在最后一个街区

if sql is not None:
    sql.close()
if dbi is not None:
    dbi.close()

感谢那些回复的人。我从你们那里学到了新东西。(下次我会尽量把我的问题说得更清楚些:)。在


Tags: theto代码closedbsqlargserror
1条回答
网友
1楼 · 发布于 2024-05-18 21:41:25

使用else:代替finally:。参见文档的Exception Handling部分:

The try ... except statement has an optional else clause, which, when present, must follow all except clauses. It is useful for code that must be executed if the try clause does not raise an exception.

for arg in sys.argv[1:]:
    try:
        f = open(arg, 'r')
    except IOError:
        print 'cannot open', arg
    else:
        print arg, 'has', len(f.readlines()), 'lines'
        f.close()

…基本上:

^{pr2}$
网友
2楼 · 发布于 2024-05-18 21:41:25

不要使用finally。如果您不希望代码总是被执行,那么您应该找到另一个满足您需要的流控制结构。在

完成此行为的一种方法是将“finally”块中的语句移到“try”块的底部。这样,当抛出异常时,它们不会被执行,而是在所有其他语句之后被执行,否则。在

编辑:

经过进一步讨论,在你的情况下,你确实想用“finally”。我建议您在尝试关闭连接之前检查它是否已经关闭。在

网友
3楼 · 发布于 2024-05-18 21:41:25

我认为在这种情况下,您确实希望使用finally,因为您希望关闭这些连接。在

我不同意在同一方法中应该有两个try块的观点。在

我认为设计中的缺陷是获取连接并用相同的方法执行查询。我建议把两者分开。服务类或方法知道工作单元。它应该获取连接,将其传递给另一个执行查询的类,完成后关闭连接。这样查询方法就可以抛出它遇到的任何异常,并将清理工作留给负责连接的类或方法。在

相关问题 更多 >

    热门问题