在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