C++标准库异常列表?

19

有没有关于C++标准库异常的参考资料?我只想知道哪些函数可能抛出异常,哪些不会。


相关:https://dev59.com/Jmct5IYBdhLWcg3wpO7H - Mooing Duck
2个回答

24

实际上,大多数标准库函数本身并不会引发异常。它们只是将由用户代码调用而引发的异常传递下去。例如,如果您向vector中push_back()一个元素,这可能会引发异常(由于内存分配错误以及)如果对象的拷贝构造函数引发异常。

一些值得注意的例外情况(没有刻意玩笑)是:

  • 一些方法在提供的索引无效时会抛出out_of_range
    • std::vector<>::at()
    • std::basic_string<>::at()
    • std::bitset<>::set()reset()flip()
  • 一些方法在整数溢出时会抛出std::overflow_error
    • std::bitset<>::to_ulong()和(C++0x)to_ullong()
  • std::allocator<T>会传递由其调用的new引发的std::bad_alloc异常。
  • 可以设置流以在设置状态位时抛出std::ios_base::failure
  • 大型数组分配可能会引发std::bad_array_new_length异常。
  • 对引用进行dynamic_cast可能会引发std::bad_cast(从技术上讲,它不是标准库的一部分)。
  • 从具有异常说明的函数中抛出无效异常将引发std::bad_exception异常。
  • 如果std::function没有值,则调用std::function::operator(...)将引发std::bad_function_call
  • 使用空指针的typeinfo可能会引发std::bad_typeid
  • 释放后访问 weak_ptr 会抛出 std::bad_weak_ptr 异常。
  • 不正确使用 std::promise/std::future 可能会抛出 std::future_error 异常。
  • (c++11) 字符串转换函数std::stoi, std::stol, std::stoll, std::stoul, std::stoull, std::stof, std::stod, 和 std::stold 可能会抛出 std::invalid_argumentstd::out_of_range 异常。
  • (c++11) 在正则表达式族中,构造函数和赋值方法可能会抛出 std::regex_error 异常。
  • (我将这个回答设置为CW,如果有人可以想到更多这样的内容,请随意追加。)

    另外,在第三版的《C++程序设计语言》中,Bjarne Stroustrup提供了一个可下载的有关异常安全的附录,也许是相关的。


    谢谢你的回答。顺便问一下,CW的答案是什么? - Brian
    @Brian:这是“社区维基”。其他人可以编辑任何CW答案(即使他们没有足够的声望来正常编辑答案)。 - sbi

    1
    唯一由编译器保证不会抛出异常的函数是具有throw()异常规范的函数,例如:
    void ThisFunctionNeverThrows() throw()
    {
    }
    

    否则,任何其他函数都有可能抛出异常,除非它们有特别的文档说明。在面对异常时编写代码时,必须考虑异常安全性。
    请参阅Bjarne Stroustup关于异常安全和标准库的文章:http://www2.research.att.com/~bs/3rd_safe.pdf 在PDF的第19页开始,您可以找到有关标准容器提供的保证的信息。

    这是不正确的,因为许多容器(例如erase())保证不会抛出异常,但是该函数并非throw()。从语言角度来看,您所写的确有意义,但除了编译器明确强制执行的保证之外,还有其他保证。 - user319799
    @doublep:如果元素类型的复制构造函数抛出异常,erase()将会抛出异常。 - kennytm
    从我提到的PDF的第21页开始(关于vectordeque的保证):“除非由元素类型的复制构造函数或赋值运算符引发,否则没有erase()会抛出异常。” - In silico
    @Kenny:并非所有容器在erase()中都会复制任何内容。当然,在vector中它可能会抛出异常,但在例如list中不会。 - user319799

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接