从类成员初始化“就地”捕获异常

时间:2015-06-23 18:00:48

标签: c++ c++11

我正在写一个有std::regex成员的课程:

class aaa {
    std::regex re {"aaabbb"};
public:
    aaa() {}
   ...
};

如果传入的字符串不是有效的正则表达式,std::regex可以抛出std::regex_error。 C ++ 11/14中是否有一种技术可以在类中捕获此异常?

与此类似:

class aaa {
    std::regex re;
public:
    aaa() 
    try 
       : re("aaabbb") {
    }
    catch(...) {
    }
};

2 个答案:

答案 0 :(得分:4)

如果初始化列表中出现异常,则实际上无法在没有重新抛出(隐式)的情况下捕获异常:

include <stdexcept>

struct E { E(int) { throw std::runtime_error("E"); } };
class A {
    E e {1};
public:
    A()
    try
    {}
    catch(...) {
        std::cout << "Exception" << std::endl;
    }
};
int main()
{
    A a;
    return 0;
}

给出:

Exception
terminate called after throwing an instance of 'std::runtime_error'
  what():  E
Aborted

但是,即使没有在初始化列表中提及成员,也可以捕获它。

因此,您可能会对成员进行异常安全初始化,并在构造函数体内处理异常关键的赋值/初始化(如建议的其他(已删除)答案)。

答案 1 :(得分:1)

可能有更好的方法,但我只是将std::regex re;声明为类成员变量,并尝试在默认和/或其他构造函数中初始化它。然后你可以在构造函数中处理异常。