Except Or Finally?

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Except Or Finally?

Сообщение Brainenjii » 20.06.2011 09:23:00

В чем принципиальная разница между, например
Код: Выделить всё
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? ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Except Or Finally?

Сообщение Mr.Smart » 20.06.2011 09:26:30

finally выполняется всегда, возникло исключение или нет.
Полезно, если нужно освободить память или произвести действия в не зависимости от ситуации.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Except Or Finally?

Сообщение ronin » 20.06.2011 09:27:27

Какой вообще смысл в Finally?


finally выполнится в любом случае, а exception только при исключительной ситуации (ошибке)
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Except Or Finally?

Сообщение Mr.Smart » 20.06.2011 09:28:33

В вашем случае первый код будет красивее, если конечно вы не собираетесь каким либо образом реагировать на эксепшен.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Except Or Finally?

Сообщение ronin » 20.06.2011 09:32:07

в идеале надо комбинировать данные конструкции, exception для обработки исключений, finally для уничтожения созданных вами объектов
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Except Or Finally?

Сообщение Brainenjii » 20.06.2011 10:42:40

2ronin: код после конструкции 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, если подобная конструкция функциональней и немногословней... И вот этот топик ^_^
Аватара пользователя
Brainenjii
энтузиаст
 
Сообщения: 1351
Зарегистрирован: 10.05.2007 00:04:46

Re: Except Or Finally?

Сообщение ronin » 20.06.2011 11:16:43

разница в том что finally не сможет подавить ошибку, и программа выдаст сообщение об ошибке после чего работа программы (процедуры) будет завершена с выполнением кода в конструкции finally? в случае с except вы сможете обработать ошибку и либо выдать нужно сообщение (например более понятное пользователю) либо, обработав тип ошибки, выполнить необходимые действия для завершения программы (процедуры)
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Except Or Finally?

Сообщение Mr.Smart » 20.06.2011 11:22:41

ronin
finally подавляет эксепшен и выполнение программы продолжается.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Except Or Finally?

Сообщение ronin » 20.06.2011 11:38:01

finally подавляет эксепшен и выполнение программы продолжается


действительно промахнулся :)
ronin
постоялец
 
Сообщения: 174
Зарегистрирован: 27.01.2010 00:14:46

Re: Except Or Finally?

Сообщение Max Rusov » 20.06.2011 14:02:38

Mr.Smart писал(а):ronin
finally подавляет эксепшен и выполнение программы продолжается.

Приплыли :(

Добавлено спустя 8 минут 8 секунд:
Brainenjii писал(а):В чем принципиальная разница между...

Принципиальна разница как раз в том, что finally _не_ подавляет exception, исполнение алгоритма прерывается, он проходит по всем вложенным Finally частям пока не попадет в завершающий Except. Без finally на одних except'ах этого очень тяжело добиться.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Except Or Finally?

Сообщение Mr.Smart » 20.06.2011 14:36:44

Max Rusov то бишь эксепшен вылетает за блоком finally end?
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Except Or Finally?

Сообщение Max Rusov » 20.06.2011 14:40:40

Mr.Smart
Вы, простите, на FPC/Delphi когда нибудь работали то? :shock:
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Except Or Finally?

Сообщение Mr.Smart » 20.06.2011 14:47:37

Max Rusov
Странные вопросы задаёте! А уточнить насчёт finally могли бы и без сарказма.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Except Or Finally?

Сообщение Max Rusov » 20.06.2011 14:51:45

Я, вроде, все написал первым постом. А на ваше месте я бы написал небольшой пример, и прошелся по нему отладчиком. Без сарказма.
Max Rusov
постоялец
 
Сообщения: 191
Зарегистрирован: 25.04.2009 15:46:03

Re: Except Or Finally?

Сообщение Vadim » 20.06.2011 15:40:16

Mr.Smart писал(а):то бишь эксепшен вылетает за блоком finally end?

Он не "за" блоком выполняется. :) try..except - это свой блок, а try..finaly - это свой блок. Обычно первый работает внутри второго.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 16

Рейтинг@Mail.ru
cron