命名空间
变体
操作

std::uncaught_exception,std::uncaught_exceptions

来自 cppreference.com
< cpp‎ | error
定义在头文件 <exception>
(1)
bool uncaught_exception() throw();
(直到 C++11)
bool uncaught_exception() noexcept;
(自 C++11 起)
(在 C++17 中已弃用)
(在 C++20 中已移除)
int uncaught_exceptions() noexcept;
(2) (自 C++17 起)
1) 检测当前线程是否具有活动异常对象,即异常已被抛出或重新抛出,但尚未进入匹配的 catch 子句,std::terminatestd::unexpected。换句话说,std::uncaught_exception 检测当前是否正在进行栈展开
2) 检测当前线程中抛出或重新抛出但尚未进入其匹配 catch 子句的异常数量。

有时,即使 std::uncaught_exception() == true,抛出异常也是安全的。例如,如果栈展开导致对象被销毁,则该对象的析构函数可以运行抛出异常的代码,只要异常在逃离析构函数之前被某个 catch 块捕获即可。

内容

[编辑] 参数

(无)

[编辑] 返回值

1) true 如果当前线程正在进行栈展开,否则为 false
2) 当前线程中未捕获异常对象的数量。

[编辑] 备注

使用返回 int 的 uncaught_exceptions 的一个示例是 boost.log 库:表达式 BOOST_LOG(logger) << foo(); 首先创建一个守卫对象,并在其构造函数中记录未捕获异常的数量。输出由守卫对象的析构函数执行,除非 foo() 抛出异常(在这种情况下,析构函数中的未捕获异常数量大于构造函数观察到的数量)。

std::experimental::scope_failstd::experimental::scope_success 在 LFTS v3 中依赖于 uncaught_exceptions 的功能,因为它们的析构函数需要执行不同的事情,具体取决于它们是在栈展开期间被调用还是在其他情况下被调用。

特性测试 Std 特性
__cpp_lib_uncaught_exceptions 201411L (C++17) std::uncaught_exceptions

[编辑] 示例

#include <exception>
#include <iostream>
#include <stdexcept>
 
struct Foo
{
    char id{'?'};
    int count = std::uncaught_exceptions();
 
    ~Foo()
    {
        count == std::uncaught_exceptions()
            ? std::cout << id << ".~Foo() called normally\n"
            : std::cout << id << ".~Foo() called during stack unwinding\n";
    }
};
 
int main()
{
    Foo f{'f'};
 
    try
    {
        Foo g{'g'};
        std::cout << "Exception thrown\n";
        throw std::runtime_error("test exception");
    }
    catch (const std::exception& e)
    {
        std::cout << "Exception caught: " << e.what() << '\n';
    }
}

可能的输出

Exception thrown
g.~Foo() called during stack unwinding
Exception caught: test exception
f.~Foo() called normally

[编辑] 缺陷报告

以下更改行为的缺陷报告被追溯应用于先前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
LWG 70 C++98 uncaught_exception() 的异常规范丢失 指定为 throw()

[编辑] 另请参阅

异常处理失败时调用的函数
(函数) [编辑]
用于处理异常对象的共享指针类型
(typedef) [编辑]
将当前异常捕获到 std::exception_ptr
(函数) [编辑]

[编辑] 外部链接

1.  GOTW 问题 47:未捕获的异常
2.  std::uncaught_exceptions 的基本原理 (N4125)