| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Блок try... finally на С++ |
| Автор: Kuvaldis 4.10.2007, 20:10 |
| Всем привет! Вот возникла у меня необходимость реализации такого блока (такого ключевого слова вроде как нету) принцип действия блока: управление в finally попадает всегда, даже если были исключения. Нужно для освобождения ресурсов Аналогично придумал делать только с метками, но это мягко говоря некрасиво. Что посоветуете? И интересно, а почему такая возможность не была заложена в язык? СУВ, Kuvaldis |
| Автор: Alek86 4.10.2007, 20:22 |
если не будет уж очень сложно менять код, можно использовать "умные" ресурсы, что себя в деструкторах освобождают |
| Автор: archimed7592 4.10.2007, 21:11 |
| Alek86, эти умные ресурсы и представляют из себя идиому RAII |
| Автор: maxim1000 4.10.2007, 22:20 | ||
ну если уж хочется совсем похоже на try-finally, можно попробовать так:
|
| Автор: Daevaorn 4.10.2007, 22:29 | ||||
"всегда" в твой catch(...) не попадешь |
| Автор: maxim1000 4.10.2007, 23:56 |
честно говоря, опыта с данной конструкцией нет но, насколько я знаю, она предназначена именно для отлова всех исключений это не так? |
| Автор: nickless 5.10.2007, 00:01 |
| maxim1000, код в finally выполняется всегда, и когда не было исключений и когда были, а в catch только после исключения. |
| Автор: archimed7592 5.10.2007, 00:03 |
Так. А что если исключения не будет Суть finally в гарантированной отработке в любых условиях: было исключение, не было исключения, return отработал, управление само по себе до finally дошло... |
| Автор: Daevaorn 5.10.2007, 00:04 |
мы должны попасть туда всегда при выходе из функции. |
| Автор: maxim1000 5.10.2007, 00:23 |
| а... ступил |
| Автор: SergeCpp 5.10.2007, 08:19 |
| Kuvaldis, а почему Рихтера не читаем?!... Там же всё разъяснено в деталях ЧАСТЬ V СТРУКТУРНАЯ ОБРАБОТКА ИСКЛЮЧЕНИЙ http://wm-help.net/books-online/print-page/59464/59464-17.html http://wm-help.net/books-online/print-page/59464/59464-18.html |
| Автор: MAKCim 5.10.2007, 08:25 |
| SergeCpp, SEH - это решение для конкретной среды |
| Автор: korbian 5.10.2007, 08:46 | ||
а может так?
|
| Автор: Daevaorn 5.10.2007, 08:58 |
и что? тоже другое поведение. |
| Автор: Lazin 5.10.2007, 09:39 |
А что будет если перед вызовом throw; исключений небыло. Ведь throw без параметров просто повторно запускает последнее перехваченное исключение. |
| Автор: antropod 5.10.2007, 13:47 | ||||
А что если попробовать так.
Конечно, дублирование кода = плохо, поэтому можно поступить следующим образом: Кидать исключение, если все прошло успешно, и обрабатывать во вложенном try..catch:
|
| Автор: Daevaorn 5.10.2007, 16:03 |
| antropod, а не легче RAII использовать и не париться? ;) ты бы ещё longjump использовал |
| Автор: nickless 5.10.2007, 16:05 |
Будет медленнее работать, исключения не расчитаны на то, чтобы их всё время кидали |
| Автор: archimed7592 5.10.2007, 16:08 |
Разве SEH отматывает стек? |
| Автор: MAKCim 5.10.2007, 16:48 |
я про то, что SEH - это платформо-зависимая вещь |
| Автор: 0lmer 7.10.2007, 06:46 |
| симуляция блока try - finally с помощью #define http://rsdn.ru/article/cpp/try_finally.xml |
| Автор: Alek86 7.10.2007, 15:01 |
| ограничение на использование запятых там плохое (( нельзя функции многие вызвать |
| Автор: archimed7592 7.10.2007, 18:09 | ||
Ещё и такая конструкция(достаточно распространённая, между прочим) облажается(должна вывести "catch finally"):
|
| Автор: Alek86 7.10.2007, 19:01 | ||
с этим дефайном?
так же нельзя, два catch(...) |
| Автор: archimed7592 7.10.2007, 19:43 |
О чём я и сказал: |
| Автор: Alek86 7.10.2007, 21:15 |
| гы а как она может быть тогда растпространенной, если она не компилируется? ) |
| Автор: archimed7592 7.10.2007, 21:20 | ||
Эта конструкция распространена в языках, поддерживающих finally - там она компилируется и работает. В С++ finally нет, а этот пример я привёл в подтверждение того, что упомянутое здесь решение через define далеко не самое лучшее(с RAII вообще ничего не сравнится |
| Автор: akizelokro 10.10.2007, 10:09 | ||
На мой взгляд, все дело в том, что хронологически C++ механизм exception появился раньше введения finally в других языках и Microsoft реализации (а); нацеленность на гибкость (б) С самого начала заложено, что после обработки исключения программа не должна автоматически вызывать terminate, а должна иметь возможность продолжить работу со следующей инструкции за блоком try-catch. Конструкция finally в том виде, в котором она применяется, чаще всего принуждается к уничтожению динамических объектов, освобождению ресурсов (и т.д. по списку), и в этом случае в 99% случаев уже нет смысла говорить о дальнейшем выполнении программы ( или функции). |
| Автор: maxim1000 10.10.2007, 10:33 |
| хмм... если уж поразмышлять о причинах отсутствия finally в С++, то мне кажется, что дело, скорее, в наличии там стековых переменных, которые автоматически удаляются с вызовами соответствующих деструкторов при при выходе из блока по return, throw или goto в Delphi с этим сложнее: более-менее сложных стековых объектов просто нет, а те, что в куче, сами по себе не удаляются (знатоки Delphi, поправьте, если глупости говорю), вот и нужно место, где в любой ситуации можно удалить созданные объекты... |
| Автор: akizelokro 10.10.2007, 10:51 |
| Здесь, кстати, можно поступить проще. Написать письмо в соответствующий комитет с просьбой ввести finally, а их ответ приписать здесь. (Или порыться в архиве отказных предложений |
| Автор: Daevaorn 10.10.2007, 11:05 | ||
тут уже не раз объяснили почему этого нет и не нужно. комитет об этих причинах, будь уверен, догадывается. |