C ++ Builder — попробуйте catch __finally использовать в C ++ Builder

Правильно ли я считаю, что этот блок кода:

try
{
Screen->Cursor = crHourGlass;
try
{
throw Exception("error!");
}
catch(Exception& e)
{
Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);
}
}
__finally
{
Screen->Cursor = crDefault;
}

Фактически идентичен этому и __в конце концов здесь не имеет смысла, потому что в обоих случаях Экран-> Курсор = crDefault все равно будет казнен?

Screen->Cursor = crHourGlass;
try
{
throw Exception("error!");
}
catch(Exception& e)
{
Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);
}
Screen->Cursor = crDefault;

0

Решение

Чтобы ответить на ваш вопрос — нет, они не идентичный, потому что есть небольшая возможность для crDefault задание, которое будет пропущено во второй версии, если произойдет что-то непредвиденное. __finally в первой версии обычно справляется с этим.

При этом альтернативой является использование контейнера RAII вместо __finallyНапример:

class TUpdateScreenCursor
{
private:
TCursor m_Original;

public:
TUpdateScreenCursor(TCursor NewCursor)
{
m_Original = Screen->Cursor;
Screen->Cursor = NewCursor;
}

~TUpdateScreenCursor()
{
Screen->Cursor = m_Original;
}
};

{
TUpdateScreenCursor sc(crHourGlass);
try
{
throw Exception("error!");
}
catch (const Exception& e)
{
Application->MessageBox(e.Message.c_str(), _D("Error"), MB_OK);
}
}
2

Другие решения

Нет, потому что вы ловите только исключения Exception тип. Если возникает какое-то другое исключение, Экран-> Курсор = crDefault не будет выполняться во второй версии кода.

3

По вопросам рекламы [email protected]