我认为这段代码是正确的:
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;
答案 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;
}
};