我是否正确地认为这段代码:
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在这里没有任何用途,因为在这两种情况下,屏幕>光标 = 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;
否,因为您只捕获Exception
类型的异常。如果发生其他异常,则不会在第二个版本的代码中执行屏幕>光标 = crDefault。
回答您的问题 - 不,它们并不相同,因为如果发生意外情况,在第二个版本中跳过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);
}
}