Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Помогите разобраться с try ... catch

Автор: mva 25.12.2012, 12:17

Доброго дня!

Может не сюда следовало бы поместить тему, но все же. Занялся подключением OpenOffice через UNO к своему приложению, написанному на Qt4. Споткнулся на непонятном поведении исключения при ошибке.

bool OOUNOReportEngine::open()
{
    bool connected = tryConnect();
    if (!connected)                 // Если сходу не удалось подключиться, то наверное сервер OpenOffice не запущен
    {
        ooProcess = new QProcess();
        ooProcess->start("soffice \"--accept=" + ooProcessCommand + "\"  --invisible");
        ooProcess->waitForStarted();
        connected = tryConnect();           // Попытаемся еще раз подключиться
    }
    if (connected)
    {
    ...
    }
    else
    {
        TApplication::exemplar()->showError(QObject::trUtf8("Не удалось запустить") + " Open Office");                   // выдадим сообщение об ошибке
    }
    return connected;
}


bool OOUNOReportEngine::tryConnect()
{
    bool result = true;

    OUString sConnectionString(OUString::createFromAscii(QString("uno:" + ooProcessCommand).toAscii()));
    Reference<XComponentContext> xComponentContext(::cppu::defaultBootstrap_InitialComponentContext());
    Reference<XMultiComponentFactory> xMultiComponentFactoryClient(xComponentContext->getServiceManager());
    xInterface = xMultiComponentFactoryClient->createInstanceWithContext(OUString("com.sun.star.bridge.UnoUrlResolver"), xComponentContext);
    Reference<XUnoUrlResolver> resolver(xInterface, UNO_QUERY);
    try
    {
        xInterface = Reference<XInterface>(resolver->resolve(sConnectionString ), UNO_QUERY);
    }
    catch (Exception& e)
    {
        qDebug() << QString().fromAscii(OUStringToOString(e.Message, RTL_TEXTENCODING_ASCII_US).pData->buffer);
        result = false;
    }
       //    По идее, после обработки ошибки выполнение программы должно возобновиться с этого места, но вместо этого сразу происходит выход из функции
    if (result)
    {
    // Если ошибки не было, то продолжим
    ...
    }
    return result;
}


Вопрос такой: почему при возникновении ошибки и ее обработки оператором catch программа не переходит к следующему за catch оператору, а сразу вываливается из фунции tryConnect?
Прошу сильно не пинать, это практически моя первая программа на C++.

Автор: Алексей1153 25.12.2012, 12:28

сборка - релиз или дебаг ?

Автор: mva 25.12.2012, 14:41

Своим вопросом Вы натолкнули меня на мысль попробовать работу в release-сборке. Там работает нормально. Похоже, что это отладчик не может корректно обрабатывать конструкции catch. Так ли это?

Автор: Алексей1153 25.12.2012, 21:40

как раз в дебаге должно нормально показываться, а в релизе может неожиданно перескакивать согласно оптимизированному коду

сдаётся мне, у тебя перепутаны названия сборок ))

Автор: mva 26.12.2012, 9:44

Ну судя по размерам собираемого исполняемого файла в том и другом случае, с наименованиями сборок все нормально. Ладно, я пока забил на это, Просто в будущем конструкции try...catch буду отлаживать без отладчика.

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)