Russian Qt Forum

Qt => Кладовая готовых решений => Тема начата: navrocky от Август 08, 2014, 08:41



Название: (С++11) Реализация try/finally
Отправлено: navrocky от Август 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 в отладке, когда отключена оптимизация возврата объекта по значению.


Название: Re: Реализация try/finally для C++11
Отправлено: ammaximus от Август 08, 2014, 20:22
Насколько я смог понять, вы решили проблему с RAII, когда в деструкторе объектов возможны исключения и двойное исключение крашило программу. Кажется в java-style остается исключение из finally как последнее, а у вас первоначальное, что тоже лучше. Жаль, что пока не могу использовать с++11.


Название: Re: Реализация try/finally для C++11
Отправлено: navrocky от Август 10, 2014, 12:36
Насколько я смог понять, вы решили проблему с RAII, когда в деструкторе объектов возможны исключения и двойное исключение крашило программу. Кажется в java-style остается исключение из finally как последнее, а у вас первоначальное, что тоже лучше.
Да, всё именно так, обычный try/catch в деструкторе.


Название: Re: Реализация try/finally для C++11
Отправлено: Igors от Август 10, 2014, 13:47
а так костылей можно много на городить, причем они еще будут и побочные эффекты давать ...
А вот свой костыль таковым не считается  :)


Название: Re: Реализация try/finally для C++11
Отправлено: navrocky от Август 10, 2014, 15:39
а так костылей можно много на городить, причем они еще будут и побочные эффекты давать ...
А вот свой костыль таковым не считается  :)

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


Название: Re: Реализация try/finally для C++11
Отправлено: navrocky от Август 25, 2014, 14:30
Исправлена ошибка многократного срабатывания функтора освобождения, проявляющаяся на компиляторах MSVC в отладке, когда отключена оптимизация возврата объекта по значению.

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