在施工期间捕获特定基础成员的例外情况

时间:2014-08-18 15:22:42

标签: c++ c++11

我知道,给定一个基类foo的课程base我可以写

foo(/*real code has parameters here*/) try : 
   base(), /*real code has parameters here*/
   anotherMember(someFunction(/*some parameters here*/))
{
} catch (...){
}

但有没有一种语法可以将try catch块放在anotherMember周围,而不是整个基本成员列表和构造函数体?

(请注意,anotherMemberconst类型,因此需要位于初始化列表中)

1 个答案:

答案 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();
       }
    }
};

类似的东西。