是否有关于C ++标准库异常的参考?我只是想知道哪些函数可能会抛出异常。
答案 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
。 std::ios_base::failure
。 std::bad_array_new_length
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
。std::stoi
,std::stol
,std::stoll
,std::stoul
,std::stoull
, std::stof
,std::stod
和std::stold
可以投放std::invalid_argument
和std::out_of_range
。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页开始,您可以找到有关标准容器所做保证的信息。