命名空间
变体
操作

std::exception_ptr

来自 cppreference.com
< cpp‎ | error
定义在头文件 <exception>
using exception_ptr = /*未指定*/
(自 C++11 起)

std::exception_ptr 是一种可为空的类似指针的类型,用于管理已抛出并使用 std::current_exception 捕获的异常对象。std::exception_ptr 的实例可以传递给另一个函数,可能在另一个线程上,在那里异常可以重新抛出并使用 catch 子句处理。

默认构造的 std::exception_ptr 是一个空指针;它不指向异常对象。

只有当两个 std::exception_ptr 实例都是空指针或都指向同一个异常对象时,它们才相等。

std::exception_ptr 不会隐式转换为任何算术、枚举或指针类型。它可以根据上下文转换为 bool,如果它是空指针,则结果为 false,否则为 true

只要至少有一个 std::exception_ptr 引用异常对象,std::exception_ptr 引用的异常对象就会保持有效:std::exception_ptr 是一种共享所有权的智能指针(注意:这除了通常的 异常对象生命周期规则)。

std::exception_ptr 满足 NullablePointer 的要求。

[编辑] 示例

#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>
 
void handle_eptr(std::exception_ptr eptr) // passing by value is OK
{
    try
    {
        if (eptr)
            std::rethrow_exception(eptr);
    }
    catch(const std::exception& e)
    {
        std::cout << "Caught exception: '" << e.what() << "'\n";
    }
}
 
int main()
{
    std::exception_ptr eptr;
 
    try
    {
        [[maybe_unused]]
        char ch = std::string().at(1); // this generates a std::out_of_range
    }
    catch(...)
    {
        eptr = std::current_exception(); // capture
    }
 
    handle_eptr(eptr);
 
} // destructor for std::out_of_range called here, when the eptr is destructed

可能的输出

Caught exception: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'

[编辑] 另请参阅

从异常对象创建 std::exception_ptr
(函数模板) [编辑]
std::exception_ptr 中捕获当前异常
(函数) [编辑]
std::exception_ptr 抛出异常
(函数) [编辑]