Russian Qt Forum
Ноябрь 22, 2024, 16:19 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: (С++11) Реализация try/finally  (Прочитано 5681 раз)
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« : Август 08, 2014, 08:41 »

Предлагаю свою реализацию так и не вошедшей в новый стандарт конструкции finally. В boost есть аналог Boost.ScopeExit, но он более многословен, хотя работает и со старым стандартом C++.

Пример использования:
Код
C++ (Qt)
{
   std::cout << "Init" << std::endl;
   FINALLY { std::cout << "Finalize" << std::endl; };
   std::cout << "Work1" << std::end;
   throw "BANG!";
   std::cout << "Work2" << std::end;
}

Вывод:
 Init
  Work1
  Finalize


Также финализацию можно отменить по ходу исполнения:
Код
C++ (Qt)
int openFile(const char* fn)
{
   int fd = ::open(fn);
   NAMED_FINALLY(fin1) { ::close(fd); }; // file will be closed if any error occurred
 
   if (!checkFileSignature(fd))
       throw std::runtime_error("File corrupted"); // file checking error
 
   fin1.cancel(); // cancel file closing and return descriptor
   return fd;
}

UPD 25.08.2014 Исправлена ошибка многократного срабатывания функтора освобождения, проявляющаяся на компиляторах MSVC в отладке, когда отключена оптимизация возврата объекта по значению.
« Последнее редактирование: Февраль 11, 2015, 18:22 от navrocky » Записан

Гугль в помощь
ammaximus
Гость
« Ответ #1 : Август 08, 2014, 20:22 »

Насколько я смог понять, вы решили проблему с RAII, когда в деструкторе объектов возможны исключения и двойное исключение крашило программу. Кажется в java-style остается исключение из finally как последнее, а у вас первоначальное, что тоже лучше. Жаль, что пока не могу использовать с++11.
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #2 : Август 10, 2014, 12:36 »

Насколько я смог понять, вы решили проблему с RAII, когда в деструкторе объектов возможны исключения и двойное исключение крашило программу. Кажется в java-style остается исключение из finally как последнее, а у вас первоначальное, что тоже лучше.
Да, всё именно так, обычный try/catch в деструкторе.
Записан

Гугль в помощь
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #3 : Август 10, 2014, 13:47 »

а так костылей можно много на городить, причем они еще будут и побочные эффекты давать ...
А вот свой костыль таковым не считается  Улыбающийся
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #4 : Август 10, 2014, 15:39 »

а так костылей можно много на городить, причем они еще будут и побочные эффекты давать ...
А вот свой костыль таковым не считается  Улыбающийся

Это не костыль. Это вариант реализации.
Записан

Гугль в помощь
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #5 : Август 25, 2014, 14:30 »

Исправлена ошибка многократного срабатывания функтора освобождения, проявляющаяся на компиляторах MSVC в отладке, когда отключена оптимизация возврата объекта по значению.

В шапке файл обновил.
Записан

Гугль в помощь
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.087 секунд. Запросов: 23.