我知道,给定一个基类foo
的课程base
我可以写
foo(/*real code has parameters here*/) try :
base(), /*real code has parameters here*/
anotherMember(someFunction(/*some parameters here*/))
{
} catch (...){
}
但有没有一种语法可以将try
catch
块放在anotherMember
周围,而不是整个基本成员列表和构造函数体?
(请注意,anotherMember
是const
类型,因此需要位于初始化列表中)
答案 0 :(得分:4)
这样做没有多大意义,但是当anotherMember
从函数初始化时,您可以将try..catch
放在该函数中。我假设它有一个不会抛出的复制构造函数和一个可能抛出的参数,而someFunction
会调用该参数。
如果anotherMember
无法正确构建,您想要做什么?
你明显的替代方法是将anotherMember
包装在某种智能指针中,如果它无法初始化,可能会使其“可空”。如果您创建了自己的特殊对象,它将包含抛出异常的消息。
struct AnotherTypeWrapper
{
std::unique_ptr< AnotherType > ptr;
std::string errorMsg;
AnotherTypeWrapper( Args&& args... ) // ok probably not variadic
{
try
{
ptr.reset( new AnotherType( std::forward(args) ) ); // or whatever the syntax
}
catch( std::exception const& err )
{
errorMsg = err.what();
}
}
};
类似的东西。