C++ 尝试在C+中使用catch+;建设者

C++ 尝试在C+中使用catch+;建设者,c++,c++builder,try-catch-finally,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);

我是否正确地认为这段代码:

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;
    }
实际上与此相同,\u最终在这里没有任何作用,因为在这两种情况下,屏幕->光标=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

回答您的问题-不,它们不完全相同,因为如果发生意外情况,则在第二版本中跳过
crDefault
赋值的可能性很小。第一个版本中的
\u finally
通常会处理这个问题

也就是说,另一种选择是使用RAII容器,而不是
\uu最终
,例如:

class TUpdateScreenCursor
{
private:
    TCursor m_Original;

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

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


回答您的问题-不,它们不完全相同,因为如果发生意外情况,
crDefault
赋值在第二个版本中被跳过的可能性很小。第一个版本中的
\u finally
通常会处理这个问题

也就是说,另一种选择是使用RAII容器,而不是
\uu最终
,例如:

class TUpdateScreenCursor
{
private:
    TCursor m_Original;

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

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


第一次尝试不应该是
\uu try
来匹配Microsoft特定的
\uu finally
?@flatmouse:不是在C++Builder中,不是。
try/\uu finally
是一个有效的组合。仅供参考,
UnicodeString(e.Message)。C\u str()
是多余的,因为
e.Message
系统::字符串和
tapplication::MessageBox()
需要
System::Char*
值作为输入,因此您可以删除类型转换:
Application->MessageBox(e.Message.c_str(),L“Error”,MB_OK)
第一次尝试不应该是
\uuuuu try
以匹配Microsoft特定的
\uuuu finally
?@flatmouse:不是在C++Builder中,不是。
try/\uu finally
是一个有效的组合。仅供参考,
UnicodeString(e.Message)。C\u str()
是多余的,由于
e.Message
是一个
System::String
tapplication::MessageBox()
需要
System::Char*
值作为输入,因此您可以删除类型转换:
Application->MessageBox(e.Message.c_str(),L“Error”,MB_OK)它也不处理
应用程序->消息框的可能性(UnicodeString(e.Message).c_str(),L“Error”,MB_OK)本身引发另一个异常,例如内存分配错误。感谢您的回复!它也不处理
Application->MessageBox(UnicodeString(e.Message).c_str(),L“Error”,MB_OK)的可能性本身引发另一个异常,例如内存分配错误。感谢您的回复!谢谢-这是一个很好的回答,但对于这个简单的操作(如更改光标类型)来说有点过火。谢谢-这是一个很好的回答,但对于这个简单的操作(如更改光标类型)来说有点过火。