С Новым годом! Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 07.07.2017
Сообщений: 105

Зачем раздел Finally, если можно написать после try.except?

18.12.2018, 14:12. Показов 2787. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Сколько я уже прочитал таких вопросов и однотипных ответов, но так и не понял.
Вот цитата из Библии Delphi по поводу try...except
При использовании try...except не будут выполнены только операторы между строкой, которая стала причиной ошибки, и except. После оператора except...end все будет выполняться, как будто ничего не произошло.
А вот оттуда же про try и finally
Между try и finally вы пишете свой сомнительный код, в котором может произойти ошибка. А между finally и end пишется код, который должен выполниться вне зависимости от результата кода между try и finally.
Так если "После оператора except...end все будет выполняться, как будто ничего не произошло.", что нам мешает освобождать занятые ресурсы после "except...end"? Мы отловили исключение, дальнейший код выполняется, ресурсы освобождаются, в чём проблема?
У меня помимо освобождения ресурсов ещё много всего важного выполняется, что к try не относится, и если оно не выполнится, будет даже хуже, чем застрявшие ресурсы, так мне что, нужно весь код в finally писать? Хоть убей, не понимаю. Объясните, плиз, или ссылку дайте, где это разжёвано нормально. Спасибо.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2018, 14:12
Ответы с готовыми решениями:

Зачем нужен finally, если можно без него?
Если в try возникает исключение, то оно обрабатывается в блоке catch. Но зачем тогда finally? Почему нельзя просто после try-catch написать...

Составить алгоритм и написать программу(если можно с объяснением как и зачем)
http://www.picase.net/pic/101337 http://www.picase.net/pic/101338 http://www.picase.net/pic/101339 Aurim, обращаю Ваше внимание на...

Зачем вообще нужно слово NULL если можно просто написать 0?
Для чего нужны все эти слова как например NULL, EOF? Вместо них можно просто цифры написать.

9
500 / 346 / 200
Регистрация: 20.10.2016
Сообщений: 1,101
18.12.2018, 16:07
И что не ясно?
Все же написано, код между except end выполнится только в том случае если произойдет исключение.
А код между finally end выполнится в любом случае.

Добавлено через 9 минут
Вас никто не загоняет ни в какие рамки, это просто инструмент, как пользоваться и пользоваться ли решаете вы сами. Архитектура приложения это ваша личная фантазия и ответственность.
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
18.12.2018, 17:11
стандартное использование finally - это отдача ресурсов
а except - когда нужно обработать ошибку
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
obj:=TMyObject.Create;
try
...
 
  try
     a:=StrToInt(s);
  except
    showMessage('Это вам не integer');
  end;
finally
  FreeAndNil(obj);
end;
0
0 / 0 / 0
Регистрация: 07.07.2017
Сообщений: 105
24.12.2018, 12:54  [ТС]
Вот вроде и вопрос расписал, а ответы одни и те же Попробую пояснить вопрос на Вашем же примере: что мешает сделать так? Код освобождения ресурсов, как я писал в начале, тоже ведь в любом случае выполнится
Delphi
1
2
3
4
5
6
7
8
obj:=TMyObject.Create;
  try
     a:=StrToInt(s);
  except
    showMessage('Это вам не integer');
  end;
  FreeAndNil(obj);
end;
или я чего-то не понимаю?
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
24.12.2018, 21:03
ничего не мешает
вы просто давите exception
иногда это оправданно
иногда это просто заметание проблем под коврик

тут как и написано выше, программист волен сам выбирать, как использовать инструменты
0
0 / 0 / 0
Регистрация: 07.07.2017
Сообщений: 105
24.12.2018, 21:13  [ТС]
Тогда в чём вообще отличие вашей конструкции от моей? Я вот этого не понимаю
0
 Аватар для krapotkin
6847 / 4674 / 1463
Регистрация: 14.04.2014
Сообщений: 20,657
Записей в блоге: 21
24.12.2018, 21:44
как обычно, в модульности и ремонтопригодности

обычно это открывается, если вы работаете в коллективе над большим проектом
в этом случае, если код следует устоявшимся практикам, то вероятность возникновения ошибки снижается многократно
если же там суверенные "находки" от автора, то тот, кто вносит изменения в код после вас, вынужден сначала понять, потом оценить равноценность замены, потом внести правки и ничего не испортить при этом

вы даже не представляете, сколько банальные begin end дают возможностей накосячить
Delphi
1
2
if AAA then
   bbb();
Delphi
1
2
3
4
if AAA then
begin
  bbb();
end;
особенно если AAA и BBB - вызов функции с аргументами строки на три

Добавлено через 42 секунды
еще раз повторюсь, это просто инструменты
разницы никакой нет
стиль написания нужен только для ремонта и изменений впоследствии
1
0 / 0 / 0
Регистрация: 07.07.2017
Сообщений: 105
29.12.2018, 10:40  [ТС]
Хм... правильно ли я понял: это
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
obj:=TMyObject.Create;
try
...
 
  try
     a:=StrToInt(s);
  except
    showMessage('Это вам не integer');
  end;
finally
  FreeAndNil(obj);
end;
vajnoe:=supervajnoe;
и это
Delphi
1
2
3
4
5
6
7
8
9
obj:=TMyObject.Create;
  try
     a:=StrToInt(s);
  except
    showMessage('Это вам не integer');
  end;
  FreeAndNil(obj);
  vajnoe:=supervajnoe;
end;
будет выполняться абсолютно одинаково, какие бы ошибки не произошли?
Вся разница лишь в эстетике написания? И доступности кода для широких масс?
0
 Аватар для Human_foot
156 / 114 / 36
Регистрация: 27.06.2018
Сообщений: 257
29.12.2018, 10:52
В данном примере да. Но вот если нужно после ошибки выйти из процедуры, то разница будет

Тут FreeAndNil выполнится
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
obj:=TMyObject.Create;
try
...
 
  try
     a:=StrToInt(s);
  except
    showMessage('Это вам не integer');
    exit;
  end;
finally
  FreeAndNil(obj);
end;
vajnoe:=supervajnoe;
а тут нет (при ошибке)
Delphi
1
2
3
4
5
6
7
8
9
10
obj:=TMyObject.Create;
  try
     a:=StrToInt(s);
  except
    showMessage('Это вам не integer');
    exit;
  end;
  FreeAndNil(obj);
  vajnoe:=supervajnoe;
end;
Как было сказано,
код между finally end выполнится в любом случае
1
0 / 0 / 0
Регистрация: 07.07.2017
Сообщений: 105
29.12.2018, 11:03  [ТС]
А вот это уже интересный момент не думал, что даже при выходе из процедуры код finally выполняется! Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2018, 11:03
Помогаю со студенческими работами здесь

Зачем писать IEnumerable<string> product если можно написать var product?
зачем писать IEnumerable&lt;string&gt; product если можно написать var product? с какой целью использую IEnumerable,IEnumerable&lt;string&gt;?...

Зачем нужен finally?
Я знаю для чего используется finally, но я не понимаю зачем использовать его если можно после try{} catch(Exception e){} просто написать...

Зачем учить указатели, если можно использовать вектор?
Не могу понять, зачем учить указатели если в большинстве случаев для выделения памяти намного легче использовать vector?

Зачем нужен PaintBox, если рисовать можно на форме ?
Объясните пожалуйста чайнику:)

Зачем нужен iterator, если можно обойтись без него?
Почему нужен итератор(iterator) если этот код #include &lt;iostream&gt; #include &lt;vector&gt; #include&lt;iterator&gt; using namespace...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru