在构造函数的function-try-block的处理程序中返回语句

时间:2015-09-03 18:59:41

标签: c++

请帮助解释下面的示例

来自C ++ n45277:15.3 - 13美元

  

如果return语句出现在构造函数的function-try-block的处理程序中,则该程序格式错误。

这是否意味着在构造函数中使用return

由于

1 个答案:

答案 0 :(得分:2)

function-try-block是一个try块,它将包裹在外部函数或构造函数的整个主体,而不仅仅是内部的部分 >身体。

对于构造函数,它允许您捕获在初始化初始化列表中的基类和数据成员时抛出的异常。如果抛出此类异常,您可以catch并根据需要处理错误,但不能return阻止catch。当执行到达catch块的末尾时,将自动重新抛出当前异常。在输入catch之前,在抛出初始异常之前成功构造的任何基类和数据成员都已被破坏以防止泄漏。

正如标准所说:

  

如果return语句出现在构造函数的function-try-block的处理程序中,则该程序格式错误。

在这种情况下,处理程序指的是catch块的try块。

例如:

int checkValue(int value)
{
    if (value == 1)
        throw std::runtime_error("illegal value");
    return value;
}

struct A
{
    std::string str;
    int value;

    A(int i) try : str("hello"), value(checkValue(i))
    {
        // constructor body here ...
        // 'return' is OK here!
    }
    catch (...)
    {
        // do something here (log the error, etc)...
        // 'return' is illegal here!
    }
};

注意try初始化列表之前的位置,构造函数的 body 位于try块内。

如果checkValue()抛出异常,则A的构造将中止,并在此过程中自动销毁str

您可以在不使用 function-try-block 的情况下完成同样的事情:

int checkValue(int value)
{
    if (value == 1)
        throw std::runtime_error("illegal value");
    return value;
}

struct A
{
    std::string str;
    int value;

    A(int i)
    {
        try
        {
            str = "hello";
            value = checkValue(i);
            // 'return' is OK here!
        }
        catch (...)
        {
            // do something here (log the error, etc)...
            // 'return' is OK here! But then the constructor
            // would not be aborted...
            throw;
        }
    }
};

其中 function-try-block 通常用于捕获/记录在正常构造函数调用的内容中引发的异常> body ,仅在初始化列表中,例如基类构造函数和数据成员构造函数。