| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Для новичков > Что значит try и finally |
| Автор: Andreyzpr 30.9.2007, 11:20 |
| Не могу понять, что делает try и finally Кто нибудь может рассказать для чего эти команды служат и что делают? |
| Автор: MetalFan 30.9.2007, 11:35 | ||
| обеспечивает выполнение кода finally-end даже если произошла ошибка между try-finally используется например для 99,9% освобождения захваченных ресурсов.
в данном случае при возникновении ошибки между try-finally файл будет закрыт и память под объект будет освобождена |
| Автор: EvilsInterrupt 30.9.2007, 12:23 | ||||||||||||
| Назначение, небольшие нюансы по исключениям. Речь пойдет о конструкциях вида: try-finally-end; , try-except-end 1. Синтаксис.
2. Работа конструкций. Что происходит в случае применения конструкций? Для того чтобы понять, что же происходит создадим прогу, добавим форму и кнопку, потом добавим ее обработчик с таким кодом:
Мы намерено не создали объект tmp !!! Чтобы посмотреть, что же будет? Код выполнится так: 1. Возникнет бага, мы же не создали объект критической секции и не присвоили ее tmp ! 2. Попадаем в конструкцию между ключевыми словами finally и end, там где вывод "Finally1" 3. После этого попадаем в конструкцию между ключевыми словами except и end, там где вывод "except". Возникает вопрос, а почему так? А почему не выполнился код, который между ключевыми словами finally и end, там где используется вывод "finally2" ? А дело вот втом что когда мы используем try-конструкции Delphi инкапсулирует следующую работу: 1) Регистрация обработчика исключительной ситуации, а это часть кода между finally-end и except-end !!! 2) В обработчик передается объект исключения 3) В ситуации применения try-finally-end объект исключения созданный между try и finally не уничтожается, объект исключения передается следующему обработчику. В ситуации же примениния try-except-end объект искючения созданный между try и exсept, гарантированно уничтожается между словами except и end!!! Из п.3 мы можем заключить, что в try-finally-end мы объект не убивается, потому управление получит код между except и end. Как только раскоментируем строку с созданием объекта tmp, то все будет ок!!! 3. Применение Раз между finally-end не уничтожается объект исключения, то зачем тогда он нужен ? Хороший вопрос ;) Дело в том что, код между код finally и end выполнится в любом случае, а код между except и end только когда будет исключение!!! И в итоге try и finally нужен он для того чтобы , корректно завершить все действия связанные по уничтожению объекта! Пример: 1. Попытка открыть файл позаписи 2. Попытка записать событие в лог-файл 3. Уничтожить объект В случае если мы пункты разместим так:
то у нас будет корректно закрыт файл! Даже если произошла исключительная ситуация. Нюанс!!! А вдруг она произошла в п.1, то выполнится п3, но ведь объект исключения не уничтожается !!! Что будет дальше? А дальше все это дело можно обернуть в конструкцию try-except-end, где между try и except поместить наш код, а в except и end обработать наши ошибки. вот теперь все! 4. Запись от SAP (Петрович)`a:
Нюанс от SAP (Петрович)`a Код между finally-end выполнится в любом случае, даже если вызвали Exit! Вот доказательство его слов:
Это означает что этот факт можно использовать для завершающих действий. |
| Автор: MetalFan 30.9.2007, 17:38 |
я описал общий смысл без углубления в дебри обработки исключений в системе... зачем объяснять про то, как устроено SEH? был вопрос что такое try..finally, я на него ответил |
| Автор: EvilsInterrupt 30.9.2007, 18:54 | ||
Затем, что вопрошающий - это возможный будущий серьезный программер. И он обязан понимать, что во время возникновения баги, создается объект исключения! Это дает четкое понимание, что в последствии объект обязан быть уничтожен! Я этого поначалу непонимал, потому что это не сразу бросается в глаза. |
| Автор: Петрович 1.10.2007, 12:38 | ||||
Согласен с MetalFan.
Ну тогда попробуй объяснить в терминах языка Delphi где тут уничтожается объект исключения:
И вообще, где тут объект исключения? Я лично не вижу! Хотя, коечно, как "опытный" программер понимаю что он там неявно существует. Короче, действительно, не обязательно знать дельфисту что такое объект исключения. А вот как пользоваться try finally/except блоками действительно знать необходимо. Соответственно, если уж объяснять, то объяснять надо именно в терминологии Delphi а не WinAPI. |
| Автор: bems 1.10.2007, 14:05 | ||||||||
| Объект исключения не обязательно уничтожается. Например для нехваток памяти используется созданый при старте программы объект, а потом он остается на случай если проблема снова возникнет (т.к. при нехватке памяти создать новый объект может и не получиться). И вообще вести речь об уничтожении объекта исключения стоит только тогда, когда нарушен естественный ход процесса (например AcquireExceptionObject).
Добавлено через 3 минуты и 38 секунд
|
| Автор: EvilsInterrupt 1.10.2007, 19:24 | ||||||||
Прошу привести код, который бы это демонстриовал или хотя бы по косвенным признакам могли бы судить о правильности ваших слов. Можно и цитату от мануала, но тогда указать мануал ;)
С каких это пор try-finally-end перстало являться исключением в смысле Delphi ? Вот выдержка из справки к Delphi 2007 Update 1:
|
| Автор: bems 3.10.2007, 13:45 | ||||||||
тут я преувеличил. только break, continue и exit. Но все-таки исключений здесь нет, а конструкция работает.
это в SysUtils
|