C++ c-tor 处理默认成员值构造异常?
C++ c-tor handle default member value construction exception?
我想处理默认值构造的 class 成员中的异常。像这样:
int func()
{
throw 9.0;
return 9;
}
struct T
{
T() try {
}
catch(...)
{
cout << __func__ << endl;
}
int a{func()};
} ;
可能吗?最新的 ISO C++ 标准对此有何评论?
编辑:我实际上证实了它适用于大多数编译器,但它是否定义明确,我通常应该使用这个结构吗?
那是不可能的,你只能捕获你在构造函数体内做的事情的异常,像这样:
struct T
{
T() {
try { a = func();}
catch(...)
{
cout << __func__ << endl;
}
}
}
另外你应该捕获异常,但不是在 ctor 中,而是在构造对象的地方。即:
try {
T t;//construct
}
catch(...)
{};
这样你就得到了施工失败。
Is it possible?
是的,该异常将由函数级处理程序处理,就像成员初始化程序抛出的任何其他异常一样。请注意,在构造函数的函数尝试块中,异常会在处理后重新抛出。如果子对象的初始化失败,这就是您想要的,因为完整的对象无效。
And what does the latest ISO C++ standard says about it?
我还没有 C++14,但是 C++11 说:
15/4: An exception thrown during the execution of the compound-statement or, for constructors and destructors,
during the initialization or destruction, respectively, of the class’s subobjects, transfers control to a handler
in a function-try-block in the same way as an exception thrown during the execution of a try-block transfers
control to other handlers.
并且 15.3/15 指定在这种情况下它被重新抛出。
should I normally use this construct?
可能不会 - 您几乎无法处理子对象初始化失败的问题,因此捕获并重新抛出异常通常没有意义。您可能希望在异常通过时报告错误。
我想处理默认值构造的 class 成员中的异常。像这样:
int func()
{
throw 9.0;
return 9;
}
struct T
{
T() try {
}
catch(...)
{
cout << __func__ << endl;
}
int a{func()};
} ;
可能吗?最新的 ISO C++ 标准对此有何评论?
编辑:我实际上证实了它适用于大多数编译器,但它是否定义明确,我通常应该使用这个结构吗?
那是不可能的,你只能捕获你在构造函数体内做的事情的异常,像这样:
struct T
{
T() {
try { a = func();}
catch(...)
{
cout << __func__ << endl;
}
}
}
另外你应该捕获异常,但不是在 ctor 中,而是在构造对象的地方。即:
try {
T t;//construct
}
catch(...)
{};
这样你就得到了施工失败。
Is it possible?
是的,该异常将由函数级处理程序处理,就像成员初始化程序抛出的任何其他异常一样。请注意,在构造函数的函数尝试块中,异常会在处理后重新抛出。如果子对象的初始化失败,这就是您想要的,因为完整的对象无效。
And what does the latest ISO C++ standard says about it?
我还没有 C++14,但是 C++11 说:
15/4: An exception thrown during the execution of the compound-statement or, for constructors and destructors, during the initialization or destruction, respectively, of the class’s subobjects, transfers control to a handler in a function-try-block in the same way as an exception thrown during the execution of a try-block transfers control to other handlers.
并且 15.3/15 指定在这种情况下它被重新抛出。
should I normally use this construct?
可能不会 - 您几乎无法处理子对象初始化失败的问题,因此捕获并重新抛出异常通常没有意义。您可能希望在异常通过时报告错误。