std::terminate
void terminate();
|
|
(C++11 前) |
[[noreturn]] void terminate() noexcept;
|
|
(C++11 起) |
|
|
|
std::terminate()
为 C++ 运行时在异常处理因下列原因失败时调用:
1) 抛出的异常未被捕捉(此情况下是否进行任何栈回溯是实现定义的)
2) 异常处理中抛出异常(例如来自某局部对象的析构函数,或来自在异常处理时必须调用的函数)
3) 静态或线程局域对象的构造函数或析构函数抛出异常
4) 以 std::atexit 或 std::at_quick_exit 注册的函数抛出异常
6) 动态异常规定遭到违背,且执行了 std::unexpected 的默认处理函数
7) std::unexpected 的非默认处理函数抛出了违背先前所违背动态异常规定的异常,若这种规定不包含 std::bad_exception
|
(C++17 前) |
8) 为一个不保有被捕获异常的对象调用 std::nested_exception::rethrow_nested
9) 从 std::thread 的起始函数抛出异常
10) 可结合的 std::thread 被析构或赋值
std::terminate()
亦可直接从程序调用。
任何情况下, std::terminate
调用当前安装的 std::terminate_handler 。默认的 std::terminate_handler 调用 std::abort 。
若析构函数在栈回溯时重设 terminate_handler ,且后面的回溯导致调用 terminate ,则在 throw 表达式的结尾安装的处理函数会得到调用。(注意:重抛出是否应用新处理函数是有歧义的)
|
(C++11 前) |
若析构函数在栈回溯时重设 terminate_handler ,则若后面的栈回溯导致调用 terminate ,调用哪个处理函数是未指定的。
|
(C++11 起) |
参数
(无)
返回值
(无)
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
DR
|
应用于
|
出版时的行为
|
正确行为
|
LWG 2111
|
C++11
|
在栈回溯期间调用 set_terminate 的效果异于 C++98 并破坏一些 ABI
|
令它未指定
|
参阅
|
std::terminate 所调用的函数类型 (typedef)
|
版本历史
(当前 | 先前) 2017年8月27日 (日) 01:51 Fruderica(讨论 | 贡献) 小 . . (2,713字节) (+213) . . (撤销)
(当前 | 先前) 2017年8月27日 (日) 01:49 Fruderica(讨论 | 贡献) 小 . . (2,500字节) (-113) . . (撤销)
(当前 | 先前) 2017年5月5日 (五) 03:50 Fruderica(讨论 | 贡献) 小 . . (2,613字节) (-1) . . (撤销)
(当前 | 先前) 2017年5月5日 (五) 03:49 Fruderica(讨论 | 贡献) 小 . . (2,614字节) (-16) . . (撤销)
(当前 | 先前) 2017年5月5日 (五) 03:48 Fruderica(讨论 | 贡献) . . (2,630字节) (-877) . . (撤销)
(当前 | 先前) 2013年7月2日 (二) 09:06 P12bot(讨论 | 贡献) 小 . . (3,507字节) (-5) . . (撤销)
(当前 | 先前) 2012年11月2日 (五) 14:58 P12bot(讨论 | 贡献) 小 . . (3,512字节) (+217) . . (撤销)
(当前 | 先前) 2012年10月26日 (五) 11:37 P12(讨论 | 贡献) 小 . . (3,295字节) (0) . . (撤销)
(当前 | 先前) 2012年10月26日 (五) 07:00 TranslationBot(讨论 | 贡献) . . (3,295字节) (-140) . . (撤销)
(当前 | 先前) 2012年10月25日 (四) 14:25 P12(讨论 | 贡献) 小 . . (3,435字节) (0) . . (撤销)
(当前 | 先前) 2012年10月25日 (四) 13:00 TranslationBot(讨论 | 贡献) . . (3,435字节) (+3,435) . .