Найти - Пользователи
Полная версия: в чем смысл finally?
Начало » Python для новичков » в чем смысл finally?
1 2
Игнат
объясните пожалуйста, зачем нужен finally?

вот пример:
        try:
self.lock.lockForWrite()
self.num[0] *= 5;
time.sleep(1.5)
self.num[0] /= 4;
finally:
self.lock.unlock()
раз finally выполняется всегда, можно ведь написать
        try:
self.lock.lockForWrite()
self.num[0] *= 5;
time.sleep(1.5)
self.num[0] /= 4;

self.lock.unlock()
так зачем он нужен?
Soteric
finally гарантирует выполнение кода, если в блоке try произошла ошибка (было выброшено исключение). В данном случае, если не использовать try-finally, то в случае ошибки lock останется заблокированным и не даст остальным объектам получить доступ к ресурсу.
bw
А self.lock.lockForWrite() должен выполняться до try.

..bw
Игнат
ну это не мой код, так для примера

получается finally используют тогда, когда лень писать блок except?
ведь если написать except - то после него код будет работать дальше
bazooka
import sys
try:
try:
raise ValueError('wtf')
except TypeError:
pass
print('finally fail')
finally:
print('finally win')
finally win
Traceback (most recent call last):
File “C:\Python26\test.py”, line 4, in <module>
raise ValueError('wtf')
ValueError: wtf
ZAN
Игнат
ну это не мой код, так для примера

получается finally используют тогда, когда лень писать блок except?
ведь если написать except - то после него код будет работать дальше
try:
code1
finally:
code2
не эквивалентно
try:
code1
except:
pass
code2
Т.к. в первом случае, если возникнет ошибка в блоке code1, она временно сохранится, а по завершении куска code2, будет выброшена заново (за исключением некоторых случаев, а каких - читать в документации питона).
try/finally больше схожа с кодом
e = None
try:
code1
except Exception e:
pass
code2
if e: raise e
bazooka
finally работает даже если внутри try вызвать sys.exit
bw
> даже если внутри try вызвать sys.exit
Даже не смешно :-). Т.е. это не показатель.
sys.exit() возбуждает исключение и всего-то, например, такой выход работать не будет:
import sys
try:
sys.exit()
except SystemExit:
pass
Хозяйке на заметку: пуленепробиваемый выход это os._exit(code), никто не спасётся.

..bw
Ferroman
Простейший пример:
try:
f = open('file', 'w')
# do something with file content
except:
print 'fail'
finally:
f.close()
Закрыть файл нужно в любом случае - в не зависимости произойдёт ошибка в блоке try или нет. finally гарантирует что так и произойдёт.
Эквивалент без finally включал бы f.close() как в блоке try так и в блоке except. Собственно конструкция просто облегчает формирование кода с обработкой ошибок и связанных блокирующихся ресурсов.
bw
Python nazi тебе скаже:
from __future__ import with_statement

with open('file', 'w') as f:
"""do something with file content"""
Бди!!!

..bw
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB