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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Блок try... finally на С++ 
:(
    Опции темы
Lazin
Дата 5.10.2007, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(korbian @  5.10.2007,  08:46 Найти цитируемый пост)

Код

try
{
    //тут какие-то действия
    // на последок
    throw;
}


А что будет если перед вызовом throw; исключений небыло. Ведь throw без параметров просто повторно запускает последнее перехваченное исключение. 

Это сообщение отредактировал(а) Lazin - 5.10.2007, 09:40
PM MAIL Skype GTalk   Вверх
antropod
Дата 5.10.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что если попробовать так.
Код

try
{
    // код 

    // освобождение_ресурсов 
}
catch( ... )
{
    // освобождение_ресурсов
    throw;
}

Конечно, дублирование кода = плохо, поэтому можно поступить следующим образом:
Кидать исключение, если все прошло успешно, и обрабатывать во вложенном try..catch:
Код

class all_okay{};

try
{
    try
    {
         printf( "Твой код здесь.\n" );

         throw all_okay;
    }
    catch( ... )
    {
        printf( "Пора освободить ресурсы.\n" );

        throw;
    }
}
catch( all_okay )
{
    printf( "Все супер.\n" );
}
catch( ... )
{
   printf( "Что-то не так...\n" );
}



Это сообщение отредактировал(а) antropod - 5.10.2007, 13:52
PM MAIL   Вверх
Daevaorn
Дата 5.10.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 51
Всего: 70



antropod, а не легче RAII использовать и не париться? ;) ты бы ещё longjump использовал smile 
PM MAIL WWW   Вверх
nickless
Дата 5.10.2007, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


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

Репутация: 19
Всего: 181



Цитата(antropod @  5.10.2007,  12:47 Найти цитируемый пост)
Кидать исключение, если все прошло успешно

Будет медленнее работать, исключения не расчитаны на то, чтобы их всё время кидали smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
archimed7592
Дата 5.10.2007, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(MAKCim @  5.10.2007,  08:25 Найти цитируемый пост)
SEH - это решение для конкретной среды 

Разве SEH отматывает стек? smile


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
MAKCim
Дата 5.10.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


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

Репутация: 52
Всего: 207



Цитата(archimed7592 @  5.10.2007,  16:08 Найти цитируемый пост)
Разве SEH отматывает стек?

я про то, что SEH - это платформо-зависимая вещь


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
0lmer
Дата 7.10.2007, 06:46 (ссылка)  | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



симуляция блока try - finally с помощью #define

http://rsdn.ru/article/cpp/try_finally.xml

PM   Вверх
Alek86
Дата 7.10.2007, 15:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



ограничение на использование запятых там плохое ((
нельзя функции многие вызвать


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 7.10.2007, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Ещё и такая конструкция(достаточно распространённая, между прочим) облажается(должна вывести "catch finally"):
Код

try
{
    throw 1;
}
catch(...)
{
    cout << "catch ";
}
finally(
    cout << "finally" << endl;
)



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 7.10.2007, 19:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



с этим дефайном?


Код

#define finally(Saver) \
catch ( ... ) \
{ \
  Saver \
  throw; \
} \
Saver



так же нельзя, два catch(...)


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 7.10.2007, 19:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  7.10.2007,  19:01 Найти цитируемый пост)
так же нельзя, два catch(...) 

О чём я и сказал:

Цитата(archimed7592 @  7.10.2007,  18:09 Найти цитируемый пост)
облажается




--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 7.10.2007, 21:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



гы

а как она может быть тогда растпространенной, если она не компилируется? )


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 7.10.2007, 21:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(Alek86 @  7.10.2007,  21:15 Найти цитируемый пост)
а как она может быть тогда растпространенной, если она не компилируется? ) 

Эта конструкция распространена в языках, поддерживающих finally - там она компилируется и работает.
В С++ finally нет, а этот пример я привёл в подтверждение того, что упомянутое здесь решение через define далеко не самое лучшее(с RAII вообще ничего не сравнится smile).


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
akizelokro
Дата 10.10.2007, 10:09 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Цитата

И интересно, а почему такая возможность не была заложена в язык?


 smile Я обзадумался, обратился к многоуважаемому талмуду достопочтенного мистера Стенли Б.Липпмана...

На мой взгляд, все дело в том, что хронологически C++ механизм exception появился раньше введения finally в других языках и Microsoft реализации (а);

нацеленность на гибкость (б)
С самого начала заложено, что после обработки исключения программа не должна автоматически вызывать terminate, а должна иметь возможность продолжить работу со следующей инструкции за блоком try-catch. Конструкция finally в том виде, в котором она применяется, чаще всего принуждается к уничтожению динамических объектов, освобождению ресурсов (и т.д. по списку), и в этом случае в 99% случаев уже нет смысла говорить о дальнейшем выполнении программы ( или функции). 




--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
maxim1000
Дата 10.10.2007, 10:33 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



хмм... если уж поразмышлять о причинах отсутствия finally в С++, то мне кажется, что дело, скорее, в наличии там стековых переменных, которые автоматически удаляются с вызовами соответствующих деструкторов при при выходе из блока по return, throw или goto
в Delphi с этим сложнее: более-менее сложных стековых объектов просто нет, а те, что в куче, сами по себе не удаляются (знатоки Delphi, поправьте, если глупости говорю), вот и нужно место, где в любой ситуации можно удалить созданные объекты...


--------------------
qqq
PM WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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