尝试catch __finally在C ++ Builder中使用

时间:2016-03-01 17:04:15

标签: c++ c++builder try-catch-finally

我认为这段代码是正确的:

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;
    }

实际上与此相同, __ finally 在这里没有用处,因为在这两种情况下都会执行 Screen-> Cursor = 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;

2 个答案:

答案 0 :(得分:4)

不,因为您只捕获Exception类型的例外。如果发生其他异常,则 Screen-> Cursor = crDefault 将不会在第二版代码中执行。

答案 1 :(得分:2)

要回答您的问题 - 不,它们不是相同的,因为如果出现意外情况,则在第二个版本中跳过a3分配的可能性很小。第一个版本中的crDefault通常会处理该问题。

话虽如此,替代方案是使用RAII容器而不是__finally,例如:

__finally

class TUpdateScreenCursor
{
private:
    TCursor m_Original;

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

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