ADR
@ADR
Delphi, Python, LabView, C, electronic, Qt/C++

Как сделать try finally в С++?

В Microsoft Visual C++ и CBuilder есть __finally.
А есть такое от Qt или в GNU C++?

Как вообще можно написать такое без finally?
class SampleLoader : public QObject
{
    Q_OBJECT
public:
    explicit SampleLoader(QObject *parent = 0);
    void load(QString sampleParameter);
 
signals:
    void workBeginEvent(int stepsCount);
    void workEvent(int step);
    void workEndEvent(bool sampleResult);
 
public slots:
};
 
void SampleLoader::load(QString sampleParameter)
{
    int count = 10;
    bool someResult = false;
    emit workBeginEvent(count);
    try 
    {
        for(int i = 0; i < count; i++)
        {
            QTest::qSleep(100); // hard work
            emit workEvent(i);
        }
        someResult = true;
    }
    finally
    {
        emit workEndEvent(someResult);
    }
}
  • Вопрос задан
  • 6659 просмотров
Пригласить эксперта
Ответы на вопрос 4
vt4a2h
@vt4a2h
Senior software engineer (C++/Qt/boost)
Нет, т.к. в C++ finally нету по стандарту, а значит сахар от MS и CB непереносим т.ч. мой совет, не пользоваться им. Обычного try-catch за глаза хватит, т.ч. почитайте как этим пользоваться просто, тут например: www.cplusplus.com/doc/tutorial/exceptions
Ответ написан
PavelK
@PavelK
А в чём неудобства?
Пиште после catch(...) {} ...
Ответ написан
Zifix
@Zifix Куратор тега Qt
Barbatum
Не нужно тянуть исключения в C++, тем более для таких тривиальных ситуаций. Они тут медленные и опасные, Qt совершенно спокойно обходится без них.
Ответ написан
@PVRG
В с++ даже не в MS и BC прекрасно работают finally. Эта технология зашита в базу языка. Благодаря ей вы знаете что любые деструкторы статических объектов локальных переменных будут вызваны в конце блоков где они определены. Если "Страусам" finally доступен, значит и вы его можете использовать. Определите class с нужным кодом деструктора в вашем коде в деструкторе опишите то что должно быть в finally. Решение уродливое. Но тут уж ничего не поделаешь.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы