Какова сфера использования предложения «наконец» в python?

Возможный дубликат:
Цель еще и, наконец, обработка исключений

Я хотел бы понять, почему предложение finally существует в выражении try/except. Я понимаю, что он делает, но явно что-то упускаю, если он заслуживает место в языке. Конкретно, в чем разница между написанием предложения в поле finally и написанием его вне оператора try/except?


person chuse    schedule 30.07.2012    source источник
comment
Код ниже, наконец, запускается, даже если исключение не перехвачено, что хорошо, скажем, для закрытия файлов, сокетов и т. д.   -  person Gonzalo    schedule 30.07.2012
comment
Это заслуживает места в языке, потому что вы не хотите, чтобы ваша программа продолжала работать после ошибки, но вы, очевидно, захотите закрыть файлы или соединения. linuxtopia.org/online_books/programming_books/   -  person jamylak    schedule 30.07.2012
comment
См. также Зачем нам нужен оператор finally в Python?   -  person Martijn Pieters    schedule 30.07.2012
comment
@jamylak Я понимаю, что вы хотите убраться, но непонятно, почему вы не можете сделать это за пределами try/except.   -  person chuse    schedule 30.07.2012


Ответы (2)


Набор finally гарантированно будет выполнен, что бы ни случилось в наборе try.

Используйте его для очистки файлов, подключений к базе данных и т. д.:

try:
    file = open('frobnaz.txt', 'w')
    raise ValueError
finally:
    file.close()
    os.path.remove('frobnaz.txt')

Это верно независимо от того, перехватывает ли обработчик исключений (набор except) исключение или нет, или если в вашем коде есть оператор return:

def foobar():
    try:
        return
    finally:
        print "finally is executed before we return!"

Использование инструкции try/finally в цикле, а затем выход из цикла с помощью continue или break снова приведет к выполнению пакета finally. Он гарантированно будет выполнен во всех случаях.

person Martijn Pieters    schedule 30.07.2012
comment
+1 отличный ответ - пример показывает, что исключение может быть вызвано некоторым кодом, но все же обеспечить очистку перед распространением исключения ... как раз цель finally. - person Rob I; 30.07.2012

Предложение finally всегда будет выполняться, что отлично, если вы пропустили тип исключения в своем коде.

Процитируем документацию:

Если finally присутствует, он указывает обработчик «очистки». Выполняется предложение try, включая все предложения кроме и else. Если исключение возникает в любом из предложений и не обрабатывается, исключение временно сохраняется. Предложение finally выполняется. Если есть сохраненное исключение, оно повторно вызывается в конце предложения finally. Если предложение finally вызывает другое исключение или выполняет оператор return или break, сохраненное исключение теряется. Информация об исключении недоступна для программы во время выполнения предложения finally.

person Christian Witts    schedule 30.07.2012