【问题标题】:try catch __finally use in C++ Buildertry catch __finally 在 C++ Builder 中使用
【发布时间】:2016-03-01 17:04:14
【问题描述】:

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

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;

【问题讨论】:

  • 不应该首先尝试__try 来匹配微软特定的__finally吗?
  • @flatmouse:不在 C++Builder 中,不。 try/__finally 是一个有效的组合。
  • 仅供参考,UnicodeString(e.Message).c_str() 是多余的,因为 e.MessageSystem::StringTApplicaton::MessageBox() 期望 System::Char* 值作为输入,因此您可以删除类型转换:Application->MessageBox(e.Message.c_str(), L"Error", MB_OK);

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


【解决方案1】:

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

【讨论】:

  • 它也不处理Application->MessageBox(UnicodeString(e.Message).c_str(), L"Error", MB_OK);本身抛出另一个异常的可能性,例如内存分配错误。
  • 感谢您的回复!
【解决方案2】:

回答您的问题 - 不,它们并不相同,因为如果发生意外情况,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);
    }
}

【讨论】:

  • 谢谢 - 这是一个很好的回复,但对于这种简单的操作(例如更改光标类型)来说有点矫枉过正。
猜你喜欢
  • 1970-01-01
  • 2012-11-25
  • 2010-10-31
  • 1970-01-01
  • 2013-12-04
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
相关资源
最近更新 更多