![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 11 Всего: 61 |
Всем привет!
Вот возникла у меня необходимость реализации такого блока (такого ключевого слова вроде как нету) принцип действия блока: управление в finally попадает всегда, даже если были исключения. Нужно для освобождения ресурсов Аналогично придумал делать только с метками, но это мягко говоря некрасиво. Что посоветуете? И интересно, а почему такая возможность не была заложена в язык? СУВ, Kuvaldis -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
возможность заложена, называется RAII. При раскрутки стека в момент исключения вываются деструкторы объектов. PS: finally есть у MS |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
если не будет уж очень сложно менять код, можно использовать "умные" ресурсы, что себя в деструкторах освобождают |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Alek86, эти умные ресурсы и представляют из себя идиому RAII
-------------------- 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 |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
ну если уж хочется совсем похоже на try-finally, можно попробовать так:
-------------------- qqq |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
честно говоря, опыта с данной конструкцией нет но, насколько я знаю, она предназначена именно для отлова всех исключений это не так? -------------------- qqq |
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
maxim1000,
код в finally выполняется всегда, и когда не было исключений и когда были, а в catch только после исключения. -------------------- ![]() 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 |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Так. А что если исключения не будет Суть finally в гарантированной отработке в любых условиях: было исключение, не было исключения, return отработал, управление само по себе до finally дошло... -------------------- 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 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
а... ступил
-------------------- qqq |
|||
|
||||
| SergeCpp |
|
|||
![]() ![]() ![]() Профиль Группа: Участник Сообщений: 955 Регистрация: 8.8.2005 Где: At Home Репутация: 15 Всего: 124 |
Kuvaldis, а почему Рихтера не читаем?!...
Там же всё разъяснено в деталях ЧАСТЬ V СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ ГЛАВА 23 Обработчики завершения ГЛАВА 24 Фильтры и обработчики исключений Это сообщение отредактировал(а) SergeCpp - 5.10.2007, 08:24 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
SergeCpp,
SEH - это решение для конкретной среды -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| korbian |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 336 Регистрация: 20.2.2007 Где: Penza Репутация: 2 Всего: 14 |
а может так?
-------------------- korbian © |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
А что будет если перед вызовом throw; исключений небыло. Ведь throw без параметров просто повторно запускает последнее перехваченное исключение. Это сообщение отредактировал(а) Lazin - 5.10.2007, 09:40 |
|||
|
||||
| antropod |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 23.5.2007 Репутация: нет Всего: нет |
А что если попробовать так.
Конечно, дублирование кода = плохо, поэтому можно поступить следующим образом: Кидать исключение, если все прошло успешно, и обрабатывать во вложенном try..catch:
Это сообщение отредактировал(а) antropod - 5.10.2007, 13:52 |
||||
|
|||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
antropod, а не легче RAII использовать и не париться? ;) ты бы ещё longjump использовал
|
|||
|
||||
| nickless |
|
|||
![]() Гентозавр ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2976 Регистрация: 29.8.2005 Где: Germany Репутация: 19 Всего: 181 |
Будет медленнее работать, исключения не расчитаны на то, чтобы их всё время кидали -------------------- ![]() 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 |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
-------------------- 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 |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
я про то, что SEH - это платформо-зависимая вещь -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| 0lmer |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 115 Регистрация: 3.12.2006 Репутация: нет Всего: -1 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
ограничение на использование запятых там плохое ((
нельзя функции многие вызвать |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Ещё и такая конструкция(достаточно распространённая, между прочим) облажается(должна вывести "catch finally"):
-------------------- 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 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
с этим дефайном?
так же нельзя, два catch(...) |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
О чём я и сказал: -------------------- 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 |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
гы
а как она может быть тогда растпространенной, если она не компилируется? ) |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Эта конструкция распространена в языках, поддерживающих finally - там она компилируется и работает. В С++ finally нет, а этот пример я привёл в подтверждение того, что упомянутое здесь решение через define далеко не самое лучшее(с RAII вообще ничего не сравнится -------------------- 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 |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
На мой взгляд, все дело в том, что хронологически C++ механизм exception появился раньше введения finally в других языках и Microsoft реализации (а); нацеленность на гибкость (б) С самого начала заложено, что после обработки исключения программа не должна автоматически вызывать terminate, а должна иметь возможность продолжить работу со следующей инструкции за блоком try-catch. Конструкция finally в том виде, в котором она применяется, чаще всего принуждается к уничтожению динамических объектов, освобождению ресурсов (и т.д. по списку), и в этом случае в 99% случаев уже нет смысла говорить о дальнейшем выполнении программы ( или функции). -------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 17 Всего: 110 |
хмм... если уж поразмышлять о причинах отсутствия finally в С++, то мне кажется, что дело, скорее, в наличии там стековых переменных, которые автоматически удаляются с вызовами соответствующих деструкторов при при выходе из блока по return, throw или goto
в Delphi с этим сложнее: более-менее сложных стековых объектов просто нет, а те, что в куче, сами по себе не удаляются (знатоки Delphi, поправьте, если глупости говорю), вот и нужно место, где в любой ситуации можно удалить созданные объекты... -------------------- qqq |
|||
|
||||
| akizelokro |
|
|||
![]() Крокодил ![]() ![]() Профиль Группа: Участник Сообщений: 761 Регистрация: 30.7.2007 Репутация: 1 Всего: 5 |
Здесь, кстати, можно поступить проще. Написать письмо в соответствующий комитет с просьбой ввести finally, а их ответ приписать здесь. (Или порыться в архиве отказных предложений
-------------------- a = a + b; b = a - b; a = a - b; |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
тут уже не раз объяснили почему этого нет и не нужно. комитет об этих причинах, будь уверен, догадывается. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |