Использование переменной в try, catch, finally statement без объявления ее вне
Я новичок в Python, вот какой код я просматриваю:
try:
connection = getConnection(database)
cursor = connection.cursor()
cursor.execute("some query")
except:
log.error("Problem.")
raise
finally:
cursor.close()
connection.close()
Правильно ли он очищается? На других языках, которые я написал, я привык делать что-то вроде этого:
connection = None
cursor = None
try:
connection = getConnection(database)
cursor = connection.cursor()
cursor.execute("some query")
except:
log.error("Problem.")
raise
finally:
if cursor is not None:
cursor.close()
if connection is not None:
connection.close()
Ответы
Ответ 1
Python не имеет области блока. Все, что определено внутри блока try
, будет доступно снаружи.
Тем не менее, у вас все еще будет проблема: если это вызов getConnection()
, который вызывает ошибку, cursor
будет undefined, поэтому ссылка в блоке finally
будет ошибочной.
Ответ 2
Я бы предложил использовать контексты, например:
from contextlib import closing
try:
with closing(getConnection(database)) as connection:
with closing(connection.cursor()) as cursor:
cursor.execute("some query")
except:
log.error("Problem")
raise
Это должно обеспечить закрытие (см. подробнее здесь).
В некоторых случаях вам даже не понадобится closing
, поскольку соединение, скорее всего, будет поддерживать сам протокол контекста, так что это будет просто with getConnection(database)...