在我们的代码库中,我们不使用C++异常,意思是“-fno-exceptions
”在gcc编译选项中(请注意这是我们公司的政策,所以不需要争论)。然而,在这种情况下,如何从引发异常的标准库中检查构造函数的失败。我已经阅读了一些SO帖子,但仍然没有明确的想法。例如,在C++ 11中,std::regex("pattern")
可以抛出regex_error异常。如果我有下面的代码:如何检查构造函数失效,例外情况禁用
class Wrapper {
public:
bool create(std::string pattern) {
try {
m_regex = std::regex(pattern);
m_state = true;
} catch (std::regex_error& e) {
//handle error case
m_state = false;
}
}
private:
std::regex m_regex;
bool m_state;
}
注: m_regex = std::regex(pattern);
将调用
explicit basic_regex(const CharT* s, flag_type f = std::regex_constants::ECMAScript)
会抛出异常和移动赋值运算符现在
basic_regex& operator=(basic_regex&& __rhs) noexcept
,没有选择使用异常,我们如何检查失败o f std :: regex的构造函数?
class Wrapper {
public:
create(std::string pattern) {
m_regex = std::regex(pattern);
// now, how to check?
// if (m_regex)?
m_state = true;
}
private:
std::regex m_regex;
}
我没有找到在std :: regex中有任何状态可以指示失败。
选项1:我可以假设如果正则表达式构造函数失败,会发生abort(),那么下面的语句m_state = true
将不会被执行?我查了一下,看起来abort()通常发生在异常启用的情况下,但没有使用catch。所以这是错误的。
选项2:我可以使用std::regex* ptr_regex = new std::regex("pattern")
,检查ptr_regex的NULL的含量?
你不能。如果你不允许使用异常(即使只是为了捕获),你必须避免使用STL。 – Gonmator
正如@Gonmator所说的,除了它不仅仅是STL:你必须避免大部分C++标准库的每个部分,特别是正则表达式。 –
对于“我们公司不允许例外”的一个很好的解决方案,除非是因为非常好的原因,例如资源非常低的嵌入式编程,或者处理遗留代码库(这是谷歌的方式),是如果可能的话,在别处找工作。因为,一个由不称职者制定的重要政策,其余的可能就是一样糟糕。例如,同样适用于例如首席执行官表示缺乏职业道德指南针:这可能影响了几乎所有的组织。 –