std::throw_with_nested
来自cppreference.com
在标头 <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_exception 和 std::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_exceptions | 202411L | (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
[编辑]参阅
(C++11) | 捕获并存储当前异常的混入类型 (类) |
(C++11) | 抛出 std::nested_exception 中的异常 (函数模板) |