std::uncaught_exception, std::uncaught_exceptions

< cpp‎ | error
 
 
工具库
通用工具
日期和时间
函数对象
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++17)

初等字符串转换
(C++17)
(C++17)
 
错误处理
异常处理
uncaught_exceptionuncaught_exceptions
(C++20 前)(C++17)
异常处理失败
(C++17 前)
(C++11)(C++17 前)
(C++17 前)
错误号
错误号
 
定义于头文件 <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
2) 当前线程中的为捕捉异常对象数。

注意

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

示例

#include <iostream>
#include <exception>
#include <stdexcept>
 
struct Foo {
    int count = std::uncaught_exceptions();
    ~Foo() {
        std::cout << (count == std::uncaught_exceptions()
            ? "~Foo() called normally\n"
            : "~Foo() called during stack unwinding\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 之中
(函数)

外部链接