Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Не присваивается значение переменной в catch


Автор: Anikmar 25.9.2009, 20:02
Интересный глюк у меня (или у компилятора?)
Код в DLL.

Вариант кода №1
Код

bool TDM_Main::OpenDataBase(wchar_t *pLinkFileName)
{
    bool Ret=false;
    try
    {
        MainConnection->ConnectionString = pLinkFileName;
        MainConnection->Connected = true;
                              Ret = true;
    }
    catch(Exception &E)
    {
        SetLastErrorString(UnicodeString(L"Ошибка открытия БД " + E.Message).c_str());
    }

    return Ret;
}

Если ловим исключение - на выходе Ret==true. Вопрос почему? Пробовал отключать оптимизацию, переключать debug/release никакого эффекта.
Видоизменяю код:
Код

bool TDM_Main::OpenDataBase(wchar_t *pLinkFileName)
{
    bool Ret;
    try
    {
        MainConnection->ConnectionString = pLinkFileName;
        MainConnection->Connected = true;
        Ret = true;
    }
    catch(Exception &E)
    {
        SetLastErrorString(UnicodeString(L"Ошибка открытия БД " + E.Message).c_str());
        Ret = false;
    }

    return Ret;
}


Теперь все нормально.

Можно видоизменить так:
Код

bool TDM_Main::OpenDataBase(wchar_t *pLinkFileName)
{
    bool Ret = true;
    try
    {
        MainConnection->ConnectionString = pLinkFileName;
        MainConnection->Connected = true;
    }
    catch(Exception &E)
    {
        SetLastErrorString(UnicodeString(L"Ошибка открытия БД " + E.Message).c_str());
        Ret = false;
    }

               Ret = !Ret;
               Ret = !Ret;

    return Ret;
}


Тоже все в порядке.

Собственно вопрос в чем: таких конструкций еще некоторое количество. Во всех такие финты на всякий случай встраивать или кто-то уже с таким глюком сталкивался?

как я понял, если в переменной Ret что-нибудь перед выходом сделать (допустим типа if (Ret) .... какое-нибудь ненужное дествие) - тогда все работает. Если между catch блоком и return ничего нет - то Ret==true стабильно вне зависимости от возникновения исключения. Откуда он это значение берет?

Автор: 586 25.9.2009, 22:01
А если так объявить переменную:
Код
volatile bool Ret = false;

Автор: Anikmar 25.9.2009, 22:15
Цитата(586 @  25.9.2009,  22:01 Найти цитируемый пост)
А если так объявить переменную:

Без разницы.
Работает правильно в двух случаях:
Либо когда значение присваивается и в блоке try и в блоке catch
Либо если перед return с этой переменной что-то сделать (проверить ее значение, переприсвоить).

Причем эффект возникает только когда собирается в dll. Если этот участок кода запустить обычным способом - все нормально.



Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)