请帮助解释下面的示例
来自C ++ n45277:15.3 - 13美元
如果
return
语句出现在构造函数的function-try-block的处理程序中,则该程序格式错误。
这是否意味着在构造函数中使用return
由于
答案 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 ,仅在初始化列表中,例如基类构造函数和数据成员构造函数。