C ++标准库异常列表?

时间:2010-05-16 13:02:07

标签: c++ exception stl

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

2 个答案:

答案 0 :(得分:19)

实际上,大多数标准库函数本身都不会抛出异常。它们只传递由它们调用的用户代码抛出的异常。例如,如果你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>会传递它调用的std::bad_alloc引发的new
  • 可以设置Streams,以便在设置状态位时抛出std::ios_base::failure
  • 大型数组分配可以抛出std::bad_array_new_length
  • 对引用的dynamic_cast可以抛出std::bad_cast(技术上不是标准库的一部分)
  • 从具有异常规范的函数中抛出无效异常将引发std::bad_exception
  • 如果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::stoistd::stolstd::stollstd::stoulstd::stoullstd::stofstd::stodstd::stold可以投放std::invalid_argumentstd::out_of_range
  • (c ++ 11)在正则表达式系列中,构造函数和赋值方法可以抛出std::regex_error

(我这是一个CW答案,所以如果有人能想到更多,请随时将它们附加到这里。)

此外,对于 The C ++ Programming Language 的第3版,Bjarne Stroustrup有一个可下载的appendix about exception safety,这可能是相关的。

答案 1 :(得分:1)

保证(由编译器)不抛出的唯一函数是具有throw()异常规范的函数,如下所示:

void ThisFunctionNeverThrows() throw()
{
}

否则,任何其他函数都可能抛出异常,除非另有特别说明。在面对异常时编写代码时,必须考虑异常安全性。

请参阅Bjarne Stroustup关于异常安全和标准库的文章:http://www2.research.att.com/~bs/3rd_safe.pdf从PDF的第19页开始,您可以找到有关标准容器所做保证的信息。