std::uncaught_exception, std::uncaught_exceptions

来自cppreference.com
< cpp‎ | error
 
 
工具库
类型支持(基本类型、 RTTI 、类型特性)
动态内存管理
错误处理
程序工具
变参数函数
日期和时间
函数对象
(C++11)
关系运算符
optionalanyvariant (C++17)
pair 与 tuple
(C++11)
(C++17)
swap 、 forward 与 move
(C++14)
(C++11)
(C++11)
初等字符串转换
(C++17)
(C++17)
类型运算
(C++11)
(C++17)
 
 
定义于头文件 <exception>
(1)
bool uncaught_exception();
(C++11 前)
bool uncaught_exception() noexcept;
(C++11 起)
(C++17 中弃用)
int uncaught_exceptions() noexcept;
(2) (C++17 起)
1) 检测当前线程是否有生存的异常对象,即被抛出或重抛出且未进入匹配的 catch 子句、 std::terminatestd::uncaught_exception 的异常。换言,检测栈回溯当前是否在进行。
2) 检测当前线程已经抛出或重抛出且未进入其匹配 catch 子句的异常对象数目。

有时抛出异常是安全的,即使当 std::uncaught_exception() == true 。例如,若栈回溯导致栈分配的对象要被析构,则该对象的析构函数可能运行抛出异常的代码,只要异常在离开析构函数前为某 catch 块所捕捉。

目录

[编辑] 参数

(无)

[编辑] 返回值

1) 若此线程中当前正在进行栈回溯则为 true
2) 当前线程中的为捕捉异常对象数。

[编辑] 注意

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

[编辑] 示例

#include <iostream>
#include <exception>
#include <stdexcept>
 
struct Foo {
    ~Foo() {
        if (std::uncaught_exception()) {
            std::cout << "~Foo() called during stack unwinding\n";
        } else {
            std::cout << "~Foo() called normally\n";
        }
    }
};
int main()
{
    Foo f;
    try {
        Foo f;
        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
~Foo() called during stack unwinding
Exception caught: test exception
~Foo() called normally

[编辑] 参阅

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

[编辑] 外部链接