功能代码:
# 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()
感谢那些回复的人。我从你们那里学到了新东西。(下次我会尽量把我的问题说得更清楚些:)。在
使用
else:
代替finally:
。参见文档的Exception Handling部分:…基本上:
^{pr2}$不要使用finally。如果您不希望代码总是被执行,那么您应该找到另一个满足您需要的流控制结构。在
完成此行为的一种方法是将“finally”块中的语句移到“try”块的底部。这样,当抛出异常时,它们不会被执行,而是在所有其他语句之后被执行,否则。在
编辑:
经过进一步讨论,在你的情况下,你确实想用“finally”。我建议您在尝试关闭连接之前检查它是否已经关闭。在
我认为在这种情况下,您确实希望使用finally,因为您希望关闭这些连接。在
我不同意在同一方法中应该有两个try块的观点。在
我认为设计中的缺陷是获取连接并用相同的方法执行查询。我建议把两者分开。服务类或方法知道工作单元。它应该获取连接,将其传递给另一个执行查询的类,完成后关闭连接。这样查询方法就可以抛出它遇到的任何异常,并将清理工作留给负责连接的类或方法。在
相关问题 更多 >
编程相关推荐