Страница 1 из 3
Except Or Finally?
Добавлено: 20.06.2011 09:23:00
Brainenjii
В чем принципиальная разница между, например
Код: Выделить всё
Var
aSession: TCriticalSession;
Begin
aSession.Enter;
Try
// Some Code
Finally
aSession.Leave;
End;
End;
и
Код: Выделить всё
Var
aSession: TCriticalSession;
Begin
aSession.Enter;
Try
// Some Code
Except On E: Exception
// Some Exception Handler
End;
aSession.Leave;
End;
Кроме того, что второй случай добавляет информацию - какое именно исключение произошло? Какой вообще смысл в Finally? ^_^
Re: Except Or Finally?
Добавлено: 20.06.2011 09:26:30
Mr.Smart
finally выполняется всегда, возникло исключение или нет.
Полезно, если нужно освободить память или произвести действия в не зависимости от ситуации.
Re: Except Or Finally?
Добавлено: 20.06.2011 09:27:27
ronin
Какой вообще смысл в Finally?
finally выполнится в любом случае, а exception только при исключительной ситуации (ошибке)
Re: Except Or Finally?
Добавлено: 20.06.2011 09:28:33
Mr.Smart
В вашем случае первый код будет красивее, если конечно вы не собираетесь каким либо образом реагировать на эксепшен.
Re: Except Or Finally?
Добавлено: 20.06.2011 09:32:07
ronin
в идеале надо комбинировать данные конструкции, exception для обработки исключений, finally для уничтожения созданных вами объектов
Re: Except Or Finally?
Добавлено: 20.06.2011 10:42:40
Brainenjii
2
ronin: код после конструкции Try.. Except..End тоже выполнится всегда - зачем finally? ^_^ И вообще, этот finally уж очень похож на войну с exception'ами. Или не понимаю его назначения... Вообще, никогда этот finally не пользовал, сейчас решил - получилось такое:
Код: Выделить всё
Try
Try
For i := 0 To bProcesses.Count - 1 Do
TProcess(bProcesses[i]).Terminate(3);
bProcesses.Clear;
For i := 0 To bCameras.Count Do
Begin
aCamera := BCameraClass(bCameras[i]);
bProcesses.Add(BuildProcess(aCamera));
End;
Except On E: Exception Do
SafeLog(E.Message);
End;
Finally
bSession.Leave;
End;
потом подумал - а зачем мне здесь finally? Переписал:
Код: Выделить всё
bSession.Enter;
Try
For i := 0 To bProcesses.Count - 1 Do
TProcess(bProcesses[i]).Terminate(3);
bProcesses.Clear;
For i := 0 To bCameras.Count Do
Begin
aCamera := BCameraClass(bCameras[i]);
bProcesses.Add(BuildProcess(aCamera));
End;
Except On E: Exception Do
SafeLog(E.Message);
End;
bSession.Leave;
Ведь как понимаю, bSession.Leave вызовется в любом случае, значит и никакого отличия от варианта с Finally нет, а 3 строчки и, что важнее, отступ сэкономлены. Опять подумал - а зачем вообще нужен finally, если подобная конструкция функциональней и немногословней... И вот этот топик ^_^
Re: Except Or Finally?
Добавлено: 20.06.2011 11:16:43
ronin
разница в том что finally не сможет подавить ошибку, и программа выдаст сообщение об ошибке после чего работа программы (процедуры) будет завершена с выполнением кода в конструкции finally? в случае с except вы сможете обработать ошибку и либо выдать нужно сообщение (например более понятное пользователю) либо, обработав тип ошибки, выполнить необходимые действия для завершения программы (процедуры)
Re: Except Or Finally?
Добавлено: 20.06.2011 11:22:41
Mr.Smart
ronin
finally подавляет эксепшен и выполнение программы продолжается.
Re: Except Or Finally?
Добавлено: 20.06.2011 11:38:01
ronin
finally подавляет эксепшен и выполнение программы продолжается
действительно промахнулся

Re: Except Or Finally?
Добавлено: 20.06.2011 14:10:46
Max Rusov
Mr.Smart писал(а):ronin
finally подавляет эксепшен и выполнение программы продолжается.
Приплыли
Добавлено спустя 8 минут 8 секунд:Brainenjii писал(а):В чем принципиальная разница между...
Принципиальна разница как раз в том, что finally _не_ подавляет exception, исполнение алгоритма прерывается, он проходит по всем вложенным Finally частям пока не попадет в завершающий Except. Без finally на одних except'ах этого очень тяжело добиться.
Re: Except Or Finally?
Добавлено: 20.06.2011 14:36:44
Mr.Smart
Max Rusov то бишь эксепшен вылетает за блоком finally end?
Re: Except Or Finally?
Добавлено: 20.06.2011 14:40:40
Max Rusov
Mr.SmartВы, простите, на FPC/Delphi когда нибудь работали то?

Re: Except Or Finally?
Добавлено: 20.06.2011 14:47:37
Mr.Smart
Max Rusov
Странные вопросы задаёте! А уточнить насчёт finally могли бы и без сарказма.
Re: Except Or Finally?
Добавлено: 20.06.2011 14:51:45
Max Rusov
Я, вроде, все написал первым постом. А на ваше месте я бы написал небольшой пример, и прошелся по нему отладчиком. Без сарказма.
Re: Except Or Finally?
Добавлено: 20.06.2011 15:40:16
Vadim
Mr.Smart писал(а):то бишь эксепшен вылетает за блоком finally end?
Он не "за" блоком выполняется.

try..except - это свой блок, а try..finaly - это свой блок. Обычно первый работает внутри второго.