Уведомления

Группа в Telegram: @pythonsu

#1 Янв. 21, 2011 13:52:11

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

в чем смысл finally?

объясните пожалуйста, зачем нужен 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()
так зачем он нужен?



Офлайн

#2 Янв. 21, 2011 13:55:15

Soteric
От:
Зарегистрирован: 2010-09-19
Сообщения: 352
Репутация: +  20  -
Профиль   Отправить e-mail  

в чем смысл finally?

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



Офлайн

#3 Янв. 21, 2011 14:45:48

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

в чем смысл finally?

А self.lock.lockForWrite() должен выполняться до try.

..bw



Офлайн

#4 Янв. 21, 2011 17:12:36

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

в чем смысл finally?

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

получается finally используют тогда, когда лень писать блок except?
ведь если написать except - то после него код будет работать дальше



Офлайн

#5 Янв. 21, 2011 17:26:29

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

в чем смысл finally?

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



Офлайн

#6 Янв. 21, 2011 18:32:54

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

в чем смысл finally?

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

получается 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



Офлайн

#7 Янв. 21, 2011 19:34:50

bazooka
От:
Зарегистрирован: 2009-04-12
Сообщения: 165
Репутация: +  0  -
Профиль   Отправить e-mail  

в чем смысл finally?

finally работает даже если внутри try вызвать sys.exit



Офлайн

#8 Янв. 21, 2011 19:51:00

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

в чем смысл finally?

> даже если внутри try вызвать sys.exit
Даже не смешно :-). Т.е. это не показатель.
sys.exit() возбуждает исключение и всего-то, например, такой выход работать не будет:

import sys
try:
sys.exit()
except SystemExit:
pass
Хозяйке на заметку: пуленепробиваемый выход это os._exit(code), никто не спасётся.

..bw



Офлайн

#9 Янв. 23, 2011 00:36:42

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

в чем смысл finally?

Простейший пример:

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

Офлайн

#10 Янв. 23, 2011 01:04:39

bw
От:
Зарегистрирован: 2007-09-26
Сообщения: 938
Репутация: +  20  -
Профиль   Адрес электронной почты  

в чем смысл finally?

Python nazi тебе скаже:

from __future__ import with_statement

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

..bw



Отредактировано (Янв. 23, 2011 01:05:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version