std::rethrow_exception

来自cppreference.com
< cpp‎ | error
在标头 <exception> 定义
[[noreturn]] void rethrow_exception( std::exception_ptr p );
(C++11 起)

抛出异常指针 p 所引用的先前捕获的异常对象,或其副本。

是否创建副本是未指定的。若创建副本,则以未指定的方式分配其存储。

p 为空则行为未定义。

参数

p - 非空 std::exception_ptr

返回值

(无)

异常

若不创建副本,则为 p 所引用的异常对象。

否则,若实现成功复制异常对象,则为这种异常对象的副本。

否则,若分配或复制失败,则分别为 std::bad_alloc 或复制异常对象时抛出的异常。

注解

P1675R2 前, rethrow_exception 未被允许复制异常对象,这在一些异常对象分配在栈上的平台上无法实现。

示例

#include <iostream>
#include <string>
#include <exception>
#include <stdexcept>
 
void handle_eptr(std::exception_ptr eptr) // 按值传递 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 {
        std::string().at(1); // 生成一个 std::out_of_range
    } catch(...) {
        eptr = std::current_exception(); // 捕获
    }
    handle_eptr(eptr);
} // std::out_of_range 的析构函数调用于此,此时析构 ept

可能的输出:

Caught exception "basic_string::at"

参阅

用于处理异常对象的共享指针类型
(typedef)
捕获当前异常到 std::exception_ptr 之中
(函数)