Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В чем смысл __finnaly? 
:(
    Опции темы
HappyLife
Дата 30.11.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Доброго времени суток уважаемые форумчане.
Объясните пожалуйста В чем заключается глубокий филосовский смысл в ключевом слове __finally
Вот два разных кода.
Код
try
{
    throw int(0);
}
catch(int & i)
{
    error();
}

Sleep(1); // Этот код всегда будет.

И этот.
Код
try
{
    try
    {
        throw int(0);
    }
    catch(int &i)
    {
        error()
    }
}
__finally
{
    Sleep(1); // Этот код всегда будет.
}

Результат один и тот же.

Это сообщение отредактировал(а) HappyLife - 30.11.2007, 11:52
PM MAIL   Вверх
volvo877
Дата 30.11.2007, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2073
Регистрация: 15.11.2004

Репутация: 13
Всего: 116



Help-ы не читаешь демонстративно?

Цитата(CodeGear Help)

bcc32 includes extensions to the C++ language that let it use finally blocks as well. Like exception handlers, a finally block must appear directly after the try block, but it is introduced by the__finally keyword instead of catch.



PM MAIL   Вверх
SenkraD
Дата 30.11.2007, 12:12 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 933
Регистрация: 3.2.2006
Где: Украина::Киев

Репутация: 9
Всего: 23



[offtop]
volvo877, у меня такое впечатление складывается, что люди иногда
(местами даже очень) зразу лезут на форум задавать вопросы, несмотря в справку,
 неища в гугле или на самом форуме, на самые примитивые темы и начисто игнорят
пункты 1 и 2 с правил форума
[/offtop]


--------------------
 Имеющий язык - да не убоится спросить! 
user posted image
PM MAIL ICQ   Вверх
Vyacheslav
Дата 30.11.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(HappyLife @  30.11.2007,  11:49 Найти цитируемый пост)
Результат один и тот же.

Естественно тот же, поскольку  таким образом подобран пример. 
Для _finally нет работы если иcходить из того, что в любом случае  обработка исключения будет проводиться по месту.
Вся проблема в том, что такой взгляд весьма своеобразен и пропагандируется  Microsoft.  Если же предположить, что обработка исключения должна производится извне ( например есть централизованный обработчик ошибок, то твой код будет выглядеть следующим образом
Код

try
{
    throw 0;
}
catch(int & i)
{
    Sleep(1); //корректно завершили
   throw; //  дальнейшее продолжение алгоритма не имеет смысла.  Обработка самой ошибки будет сделана выше 
             //централизованно для всего приложения
}

Sleep(1); // Этот код всегда будет.




и

Код

try
{
         throw 0;
 }
__finally
{
    Sleep(1); // Этот код всегда будет.
}



Правда в С++ можно  относительно легко обойтись без __finally используя принцип  гардов( GUARD). Если ситуация со Sleep встречается довольно часто,  то может быть применено решение
Код

struct TGuardSleep
{
    ~TGuardSleep(){  Sleep(1); }
};

В результате получим
Код

{
   TGuardSleep guardSleep;
   throw 0;
}











--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
HappyLife
Дата 30.11.2007, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 642
Регистрация: 17.5.2006

Репутация: 4
Всего: 8



Vyacheslav, 
Спасибо вам огромнейшее.

PM MAIL   Вверх
ksili
Дата 4.12.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2069
Регистрация: 3.11.2005
Где: Красноярск

Репутация: 1
Всего: 17



Я читал где-то статью про структурную обработку исключений (SEH). А может это была и глава из книги. Так вот про __finally там говорилось, что оно для более удобной финализации функций. То есть допустим в функции есть такие действия, которые должны быть обязательно выполнены, вне зависимости от корректности завершения функции. Такими дйствиями могут быть например освобождение выделенной в начале функции памяти или запись в лог. Проблема в том, что в фукции может быть много return'ов. Так вот, чтобы не писать так:
Код

a = new ....
b = new ....
c = new ....

.........

if(...)
    {
      delete a;
      delete b;
      delete c;
      return;
    }
....
if(...)
    {
      delete a;
      delete b;
      delete c;
      return;
    }
.....
if(...)
    {
      delete a;
      delete b;
      delete c;
      return;
    }
......
}

Можно воспользоваться __finally:
Код

a = new ....
b = new ....
c = new ....

.........

try
   {
    if(...)   return;
....
    if(...)   return;
.....
    if(...)   return;
...
    }
__finally
    {
      delete a;
      delete b;
      delete c;
    }
}

То есть запись получается короче, и получаем 100% уверенность, что память освободится. Это можно использовать даже не для обработки исключений.

Это сообщение отредактировал(а) ksili - 4.12.2007, 14:19


--------------------
Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с)
PM MAIL   Вверх
Vyacheslav
Дата 5.12.2007, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 47
Всего: 59



Цитата(ksili @  4.12.2007,  14:16 Найти цитируемый пост)
Можно воспользоваться __finally:


А можно воспользовать auto_ptr или другими подобными конcтрукциями. Поэтому спор о целесобразности  __finally попрежнему  стоит на повестке дня smile 


--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Lazin
Дата 5.12.2007, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 18
Всего: 154



я где-то читал что лучше не смешивать использование обработки исключений в стили С++ (try catch) и расширения M$ (_try _except _finally).
В программе на С++ все исключения должны обрабатываться как С++ исключения.
PM MAIL Skype GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++ Builder"
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по С++ Builder обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Настоятельно рекомендуем заглянуть в DRKB (Delphi Russian Knowledge Base) - крупнейший в рунете сборник материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C++ Builder | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.