有没有关于C++标准库异常的参考资料?我只想知道哪些函数可能抛出异常,哪些不会。
实际上,大多数标准库函数本身并不会引发异常。它们只是将由用户代码调用而引发的异常传递下去。例如,如果您向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
异常。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
异常。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,如果有人可以想到更多这样的内容,请随意追加。)
另外,在第三版的《C++程序设计语言》中,Bjarne Stroustrup提供了一个可下载的有关异常安全的附录,也许是相关的。
throw()
异常规范的函数,例如:void ThisFunctionNeverThrows() throw()
{
}
erase()
)保证不会抛出异常,但是该函数并非throw()
。从语言角度来看,您所写的确有意义,但除了编译器明确强制执行的保证之外,还有其他保证。 - user319799erase()
将会抛出异常。 - kennytmvector
和deque
的保证):“除非由元素类型的复制构造函数或赋值运算符引发,否则没有erase()
会抛出异常。” - In silicoerase()
中都会复制任何内容。当然,在vector
中它可能会抛出异常,但在例如list
中不会。 - user319799