我正在写一个有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(...) {
}
};
答案 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;
声明为类成员变量,并尝试在默认和/或其他构造函数中初始化它。然后你可以在构造函数中处理异常。