Код функции:
# 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 всегда будет выполняться.
В приведенном выше коде я не хочу, чтобы finally во втором блоке try выполнялось, если в первом блоке try есть исключение. Что я делаю не так?
(Примечание: использование python 2.4)
Пояснение: я не знаю, если MySQLdb автоматически закрывает соединения при возникновении ошибки. Проблема, с которой я сталкиваюсь в приведенном выше коде, заключается в том, что при возникновении ошибки при установлении соединения (первый блок try кода) при вызове dbi.close () в блоке finally возникает ошибка «AttributeError: объект NoneType не имеет атрибут 'close' 'со ссылкой на dbi ...
Решение :
Это сработало как хотелось -
# define at the start
dbi = None
sql = None
В блоке finally,
if sql is not None:
sql.close()
if dbi is not None:
dbi.close()
Спасибо тем, кто ответил. Я узнал что-то новое от всех вас. (Я постараюсь сформулировать мои вопросы более четко в следующий раз:).