kirasole
Янв. 24, 2011 01:27:29
Ferroman
Простейший пример:
try:
f = open('file', 'w')
# do something with file content
except:
print 'fail'
finally:
f.close()
Закрыть файл нужно в любом случае - в не зависимости произойдёт ошибка в блоке try или нет.
А почему нельзя написать:
try:
f = open('file', 'w')
# do something with file content
except:
print 'fail'
f.close()
dimabest
Янв. 24, 2011 14:03:43
# coding: utf8
def test1():
try:
print 'open file'
1/0
except:
print 'catch exception'
return
print 'close file'
def test2():
try:
print 'open file'
1/0
except:
print 'catch exception'
return
finally:
print 'close file'
print 'WITHOUT finally:'
test1()
print '\nWITH finally:'
test2()
return в перой функции можно заменить на генерацию другого исключения
raise или
raise ValueError('omg, error!!!') - код ниже выполнен не будет
bw
Янв. 24, 2011 14:49:49
> А почему нельзя написать
Можно написать. Но почти всегда нужно пропускать исключение дальше, но так же закрывать файл/освобождать-лок и т.д. finally выполняется и в случае исключений и в случае нормального продолжения исполнения кода и если в блоке try стоит return.
Но я считаю что со временем finally будет вытеснен with. Писать “большой” код с потенциальными ошибками в finally не положено, он как бы только для освобождения ресурсов, закрытия файловых дескрипторов и тому подобному, но с этим справляется и with и на мой взгляд выглядит чуть ли не привлекательнее чем try.
..bw
Ferroman
Янв. 25, 2011 01:23:31
Да, всё время забываю об этой конструкции. Но мне finally как-то привычней.