从构造函数的初始化程序列表中捕获异常

时间:2020-03-06 15:00:09  来源:igfitidea点击:

这是一个奇怪的。我有一个类A。它有一个类B,我要使用初始化程序列表在A的构造函数中对其进行初始化,如下所示:

class A {
    public:
    A(const B& b): mB(b) { };

    private:
    B mB;
};

有没有办法捕捉仍然使用初始化列表方法的mB的复制构造函数引发的异常?还是我必须在构造函数的括号内初始化mB才能进行尝试/捕获?

解决方案

我看不到如何使用Initializer-list语法来做到这一点,但是我也有点怀疑我们是否可以通过在构造函数中捕获异常来做任何有用的事情。显然,这取决于类的设计,但是在哪种情况下我们将无法创建" mB",而仍然具有有用的" A"对象?

我们最好让异常渗透,并在调用A的构造函数的任何地方进行处理。

阅读http://weseetips.wordpress.com/tag/exception-from-constructor-initializer-list/)

编辑:经过更多挖掘,这些被称为"功能尝试块"。

我承认,直到我去寻找,我也不知道这一点。我们每天都在学习!我不知道这是否表明我最近很少使用C ++,我缺乏C ++知识或者经常散布该语言的拜占庭功能。嗯,我还是喜欢它:)

为了确保人们不必跳到另一个站点,构造函数的try块的语法为:

C::C()
try : init1(), ..., initn()
{
  // Constructor
}
catch(...)
{
  // Handle exception
}

它不是特别漂亮:

A::A(const B& b) try : mB(b) 
{ 
    // constructor stuff
}
catch (/* exception type */) 
{
    // handle the exception
}