Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с try ... catch
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие
mva
Доброго дня!

Может не сюда следовало бы поместить тему, но все же. Занялся подключением 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
сборка - релиз или дебаг ?
mva
Своим вопросом Вы натолкнули меня на мысль попробовать работу в release-сборке. Там работает нормально. Похоже, что это отладчик не может корректно обрабатывать конструкции catch. Так ли это?
Алексей1153
как раз в дебаге должно нормально показываться, а в релизе может неожиданно перескакивать согласно оптимизированному коду

сдаётся мне, у тебя перепутаны названия сборок ))
mva
Ну судя по размерам собираемого исполняемого файла в том и другом случае, с наименованиями сборок все нормально. Ладно, я пока забил на это, Просто в будущем конструкции try...catch буду отлаживать без отладчика.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2018 IPS, Inc.