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


Автор: MaximNR 5.7.2005, 21:09
Подскажите, а то что-то меня заклинило, есть код:
Код

try
    {
        try
        {
            list->SaveToFile(ffile_name);
        }
        catch(...)
        {
            return false;
        }
    }
    __finally
    {
        ShowMessage("test message finally");
    }
    return true;


Если при записи файла возникает исключение, т.е. выполняется return false, блок __finally не выполняется.
Должен блок выполняться или нет?
По идее должен, но может быть есть какие-либо ограничения?
Пробовал на bcb5, под рукой другой версии нет.
Сейчас мучительно пытаюсь вспомнить, как я делал подобное раньше.

Автор: MaximNR 5.7.2005, 21:28
Что-то совсем не то, нашел 3й билдер, поставил, написал простейшую программку

Код

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
    try
    {
        try
        {
            throw Exception("ex");
        }
        catch(...)
        {
            return;
        }
    }
    __finally
    {
        ShowMessage("finally");
    }
    
}


В ней выводится сообщение из финалли, но эта же программа в в 5м не выводит.

Я запутался окончательно.

Мысли в слух:
-Может быть это где-то в настройках устанавливается?
-Да вряд-ли, это же стандарт.

Автор: chaos 6.7.2005, 07:34
раз так не выходит, пойди другим путем - введи какой нибудь флажок!
делой вывод о выходе из фуркции полсе __try __finally

Автор: MaximNR 6.7.2005, 12:27
вопрос не в том как от этого избавится, а в том, что это серьезный глюк компилятора, именно компилятора, а не какой-либо библиотеки.
но я на 5й билдер случайно попал, у меня дома другого нет, в 6м все нормально.

Автор: chaos 6.7.2005, 12:32
да выкинь ты это 5 билдер, он мне столкько крови попортил smile

Автор: MaximNR 6.7.2005, 12:35
Хотя сейчас в 6м проверил, тоже самоеsmile
Может быть это самая структура какая-либо неправильная.
Помнится в книжке некого Рихтера, не рекомендовалось так выходить из катча, но не потому что так нельзя, а потому что системе приходится делать много дополнительных действий, что бы это реализовать, например, сохранять возвращаемое функцией значение перед входом в блок, потом его восстанавливать.
Если финалли внутри катча, то все прекрасно работает

А может быть все же я не прав?

Автор: MaximNR 6.7.2005, 17:33
А чего такое молчание, никто такие конструкции не использует что ли?

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