如何处理或避免C ++ 11 <regex>匹配函数(第28.11节)带来的异常?

乔蒂克

从C ++ 11开始,<regex>标头定义函数std::regex_matchstd::regex_searchstd::regex_replace§28.11中我猜有一个合理的理由不要使用这些函数noexcept,但是我找不到关于这些函数可能抛出的内容或原因的任何参考。

  1. 这些函数可能引发什么类型的异常?
  2. 哪些运行时条件导致引发这些异常?
    • 该标准是否确保对于某些参数集这些函数不会抛出regex_match(anyString, regex("."))异常,例如,它是否确保不会抛出异常?

PS:由于其中一些异常可能继承自std::runtime_error,因此它们可能std::bad_alloc在构造过程中抛出

mceo

C ++ 11§28.6状态

该类regex_error定义了作为异常抛出的对象的类型,以报告正则表达式库中的错误。

这意味着<regex>库不应自己抛出其他任何内容。您是正确的,因为内存不足条件,在构造过程中可能会引发regex_error从继承的构造,因此您还必须在错误处理代码中进行检查。不幸的是,这使得无法确定实际抛出的构造runtime_errorbad_allocregex_errorbad_alloc

对于§28.11正则表达式算法,它是在说§28.11.1

本节中描述的算法可能会引发type异常regex_error如果e抛出此类异常e.code()则应返回regex_constants::error_complexityregex_-constants::error_stack

这意味着,如果第28.11节中的函数抛出a regex_error,则它将保留这些代码之一,而别无其他。但是,还请注意,传递给<regex>库的内容(例如分配器等)也可能会抛出,例如,match_results如果将结果添加到给定match_results容器,则其分配器可能会触发另请注意,第28.11节具有一些“仿佛”构造的简写函数match_results,例如

template <class BidirectionalIterator, class charT, class traits>
bool regex_match(BidirectionalIterator first, BidirectionalIterator last,
                 const basic_regex<charT, traits> & e,
                 regex_constants::match_flag_type flags =
                 regex_constants::match_default);

template <class BidirectionalIterator, class charT, class traits>
bool regex_search(BidirectionalIterator first, BidirectionalIterator last,
                  const basic_regex<charT, traits> & e,
                  regex_constants::match_flag_type flags =
                  regex_constants::match_default); 

可能还有其他。由于这样可能会match_resultsallocator内部构造并与标准一起使用,因此它们可能会抛出任何std::allocator异常。因此,regex_match(anyString, regex("."))由于默认分配器的构造和使用,您的简单示例也可能抛出。

另一个需要注意的注意事项是,对于某些<regex>函数和类,当前无法确定abad_alloc是由某些分配器抛出还是在构造regex_error异常期间抛出。

通常,如果您需要更好的异常规范,请避免使用<regex>如果您需要简单的模式匹配,则最好使用自己的安全match / search / replace函数,因为不可能约束您的正则表达式以可移植或前向兼容的方式避免这些异常,即使使用空的正则表达式也是如此。""可能会给你一个例外。

PS:请注意,C ++ 11标准在某些方面写得很差,缺少完整的交叉引用。例如,在条款下没有明确声明match_results可以扔东西的方法,而§28.10.1.1指出(强调我的意思):

在所有match_results构造函数中,参数的副本Allocator应用于对象的生存期内构造函数或成员函数执行任何内存分配

因此,像律师一样浏览标准时请多加注意!;-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章