在c++标准11之前,c++在函数声明中有exception功能,用来指定函数抛出的异常类型。
void func1() throw(runtime_error); // 可能抛出runtime_error的异常
void func2() throw(); // 不会抛出任何异常
void func3(); // 可以抛出任何异常
如果函数抛出了没有在异常说明中列出的异常,则编译器会调用标准库函数unexpected。默认情况下,unexcepted函数会调用terminate函数终止程序。
由于这种异常声明的功能很少使用,所以在c++11中被弃用,c++11引入noexcept,具体用法如下:
void func4 noexcept;
noexcept的功能相当于上面的throw(),表示函数不会抛出异常。如果noexcept修饰的函数抛出了异常,编译器可以选择直接调用std::terminate()来终止程序运行,noexcept比throw()的效率高一些。
一段代码说明noexcept与throw()的关系:(c++config.h)
// Macro for noexcept, to support in mixed 03/0x mode.
#ifndef _GLIBCXX_NOEXCEPT
# if __cplusplus >= 201103L
# define _GLIBCXX_NOEXCEPT noexcept
# define _GLIBCXX_USE_NOEXCEPT noexcept
# define _GLIBCXX_THROW(_EXC)
# else
# define _GLIBCXX_NOEXCEPT
# define _GLIBCXX_USE_NOEXCEPT throw()
# define _GLIBCXX_THROW(_EXC) throw(_EXC)
# endif
#endif