Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Финализация вызовов при обработке исключений |
Автор: regis 4.2.2008, 15:46 | ||
Собственно, возник такой вопрос. Предположим, что глубоко в последовательности вызовов может быть возбуждено исключение (см. пример):
Вопрос в том, как обработать ненормальное завершение работы work_func. Т.е. реально ли создать какой-нибудь обработчик, который будет вызываться, если ее выполнение было прервано по throw из inner?? Насколько я понимаю, через определение специальных классов с деструкторами этого можно добиться -- но мне интересно, есть ли более короткий путь. |
Автор: xvr 4.2.2008, 15:50 | ||||||
Ну например так:
|
Автор: archimed7592 4.2.2008, 18:25 |
Лучше использовать RAII. |
Автор: Alek86 4.2.2008, 18:52 | ||
даже если в
в // do something будут TRACE'ы для отладки? лично мне лень тогда классы добавлять... |
Автор: archimed7592 4.2.2008, 18:59 |
![]() Я переодически использую самописный велосипед LogOnFailure logger(LOG_MSG("bla-bla-bla"));. |
Автор: Alek86 4.2.2008, 19:03 |
прогнал ( а если такая фича и в бусте есть (уверен, есть), то я тоже за RAII во всех случаях (кроме когда уж совсем лень) |
Автор: archimed7592 5.2.2008, 03:03 |
В бусте я logging capabilities не заметил... Найдёшь - отпишись ![]() |
Автор: Daevaorn 5.2.2008, 03:44 | ||
http://www.torjo.com/log2/doc/html/index.html |
Автор: archimed7592 5.2.2008, 04:48 |
Daevaorn, интересненько ![]() А есть ли где-нибудь информация о том, почему библиотека не включена в буст(видимо есть какие-то недоработки?), когда ориентировочно собираются включить, собираются ли вообще? |
Автор: regis 5.2.2008, 15:26 | ||
Всем спасибо, кто ответил. RAII -- это, как я понимаю, и есть то, о чем я говорил выше. С этим подходом есть проблема: в work_func может быть много локальных переменных и соответственно много чего с ним необходимо сделать для корректной финализации. Т.е. завернуть это в конструкторы/деструкторы объекта вряд ли получится. Более симпатично выглядит идея с re-throw. Однако, можно ли throw без аргументов вызвать из другого места, кроме обработчика в catch? Например, вот такой подход:
-- такое сработает или нет? |
Автор: xvr 5.2.2008, 17:30 | ||||||
Можно, но это место должно быть вложенно в блок catch (статически или динамически)
|