2016-11-11 64 views
1

在我们的代码库中,我们不使用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的含量?

+2

你不能。如果你不允许使用异常(即使只是为了捕获),你必须避免使用STL。 – Gonmator

+0

正如@Gonmator所说的,除了它不仅仅是STL:你必须避免大部分C++标准库的每个部分,特别是正则表达式。 –

+1

对于“我们公司不允许例外”的一个很好的解决方案,除非是因为非常好的原因,例如资源非常低的嵌入式编程,或者处理遗留代码库(这是谷歌的方式),是如果可能的话,在别处找工作。因为,一个由不称职者制定的重要政策,其余的可能就是一样糟糕。例如,同样适用于例如首席执行官表示缺乏职业道德指南针:这可能影响了几乎所有的组织。 –

回答

2

这是一个有些未解决的问题和one of the big open problems discussed by SG14,在“低延迟”研究小组委员会。

至于标准而言,这简直是不确定的。例外情况不是可选的,并且未指定如果将它们关闭,会发生什么情况。因此标准库通常不提供处理错误的替代方法。目前在将来的提案中有一种趋于减轻这种情况的倾向。例如,当前的文件系统TS具有非抛出重载,它会为可能抛出异常的所有函数返回一个错误码。以类似的方式为现有的标准库设施提供非抛弃替代方案也是可能的,但这正是SG14试图找出的结果。

截至目前,重要的问题是:是什么,如果遇到编译器做throw有例外编译时禁用(或try/catch)?如前所述,该标准根本没有说明这一点,因此这里的任何解决方案都必须是不可移植的。有机会,你将无法通过throw来发现或恢复库中指示的错误,所以如果你不能预先排除抛出异常,你可能想要避免抛出函数(因此,大部分标准库)。

希望这种情况在未来会有所改善。

+0

是的,我们真的被困在这。但是我们不得不寻找一些解决方案或解决问题,因为我们或我们的客户不能等待委员会。 – pepero

+0

@pepero我感到你的痛苦。您可能希望留意其他实现。由于这个原因和其他原因,许多供应商已经提出了他们自己的标准库设施的实现。 '嵌入式STL'是互联网搜索的一个很好的起始关键字。有时候Boost会提供额外的保证。不幸的是,我不知道任何'std :: regex'的实现可以解决你的问题。 – ComicSansMS

0

创建,其目的是包装异常,需要std实用程序库。

此库编译并启用了异常。

它或者存储相当于optional<std::regex>(例如)。它提供可能失败的构造函数(在库的.cpp内)调用构造函数,然后尝试/ catch并将失败转变为空的regex

如果还有其他可以抛出的操作,它将它们包含在具有错误返回路径的方法中。也许他们会返回std::experimental::expected<T, error_information>

您必须小心ODR并链接此库和用异常禁用的std库编译的代码,因为它们之间的内联函数会有所不同。我现在不详细说明如何避免这个问题。

从我可以从一个非常快速的谷歌,膨胀和从一个图书馆启用例外应该是主要限制与该图书馆的规模扩大。测试这个。

相关问题