crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Помогите разобраться с try ... catch
mva
  опции профиля:
сообщение 25.12.2012, 12:17
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Доброго дня!

Может не сюда следовало бы поместить тему, но все же. Занялся подключением 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++.

Сообщение отредактировал mva - 25.12.2012, 12:20
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.12.2012, 12:28
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


сборка - релиз или дебаг ?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 25.12.2012, 14:41
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


Своим вопросом Вы натолкнули меня на мысль попробовать работу в release-сборке. Там работает нормально. Похоже, что это отладчик не может корректно обрабатывать конструкции catch. Так ли это?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 25.12.2012, 21:40
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


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

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

Сообщение отредактировал Алексей1153 - 25.12.2012, 21:41
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 26.12.2012, 9:44
Сообщение #5


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

Спасибо сказали: 3 раз(а)




Репутация:   0  


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


Сообщение отредактировал mva - 26.12.2012, 9:47
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.3.2024, 22:19