【发布时间】:2017-03-25 12:04:34
【问题描述】:
在我们的代码库中,我们不使用 c++ 异常,即 gcc 编译选项中的“-fno-exceptions”(请注意这是我们公司的政策,因此无需争论)。但是,在这种情况下,如何检查标准库中抛出异常的构造函数是否失败。我已经阅读了一些 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
现在,如果没有使用异常的选项,我们如何检查 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 的空性吗?
【问题讨论】:
-
你不能。如果不允许使用异常(即使只是为了捕获),则必须避免使用 STL。
-
正如@Gonmator 所说,除了它不仅仅是 STL:您必须避免使用 C++ 标准库的大多数部分,尤其是正则表达式。
-
“我们公司不允许例外”的一个很好的解决方案,除非这是出于非常好的原因,例如非常低资源的嵌入式编程,或者处理遗留代码库(这就是它的方式在谷歌),如果可能的话,是在别处找工作。因为,由于无能者制定了一项重要政策,其余政策很可能同样糟糕。这同样适用于例如首席执行官透露缺乏职业道德指南:这可能影响了几乎整个组织。
-
@Cheersandhth.-Alf,是的,不幸的是,它属于你提到的充分理由之一(实际上是两者)。我真的在互联网上搜索了一些工作,但到目前为止仍然一无所知。
标签: c++ c++11 exception constructor