std::throw_with_nested

来自cppreference.com
< cpp‎ | error
在标头 <exception> 定义
template<class T >
[[noreturn]]void throw_with_nested( T&& t );
(C++11 起)
(C++26 起为 constexpr)

std::decay<T>::type 是非 final、非联合体类型,且既非 std::nested_exception 亦非从 std::nested_exception 派生的类类型,则抛出一个从 std::nested_exceptionstd::decay<T>::type 两者公开派生的未指定类型的异常,它从 std::forward<T>(t) 构造。 nested_exception 基类的默认构造函数调用 std::current_exception,以一个 std::exception_ptr 捕获当前处理的异常对象,若它存在。

否则抛出 std::forward<T>(t)

要求 std::decay<T>::type可复制构造(CopyConstructible)

目录

[编辑]参数

t - 要抛出的异常对象

[编辑]注解

功能特性测试标准功能特性
__cpp_lib_constexpr_exceptions202411L(C++26)constexpr 的异常类型

[编辑]示例

演示构造并通过 nested_exception 对象递归。

#include <exception>#include <fstream>#include <iostream>#include <stdexcept>#include <string>   // 打印异常的解释性字符串。若异常内嵌,则递归打印其保有的异常的解释性字符串void print_exception(conststd::exception& e, int level =0){std::cerr<<std::string(level, ' ')<<"exception: "<< e.what()<<'\n';try{std::rethrow_if_nested(e);}catch(conststd::exception& nestedException){ print_exception(nestedException, level +1);}catch(...){}}   // 示例函数,捕捉异常并将其包装于 nested_exceptionvoid open_file(conststd::string& s){try{std::ifstream file(s); file.exceptions(std::ios_base::failbit);}catch(...){ std::throw_with_nested(std::runtime_error("Couldn't open "+ s));}}   // 示例函数,捕捉异常并将其包装于 nested_exceptionvoid run(){try{ open_file("nonexistent.file");}catch(...){ std::throw_with_nested(std::runtime_error("run() failed"));}}   // 运行上述实例函数并打印捕捉的异常int main(){try{ run();}catch(conststd::exception& e){ print_exception(e);}}

可能的输出:

exception: run() failed exception: Couldn't open nonexistent.file exception: basic_ios::clear

[编辑]参阅

捕获并存储当前异常的混入类型
(类)[编辑]
抛出 std::nested_exception 中的异常
(函数模板)[编辑]
close