std::nested_exception
来自cppreference.com
在标头 <exception> 定义 | ||
class nested_exception; | (C++11 起) | |
std::nested_exception
是一个多态混入类,可以捕获并存储当前异常,令任意类型的异常彼此间内嵌变得可行。
| (C++26 起) |
目录 |
[编辑]成员函数
构造 nested_exception (公开成员函数) | |
[虚] | 析构 nested exception (虚公开成员函数) |
替换 nested_exception 的内容 (公开成员函数) | |
抛出存储的异常 (公开成员函数) | |
获得指向存储的异常的指针 (公开成员函数) |
[编辑]非成员函数
(C++11) | 抛出实参,带上混入的 std::nested_exception (函数模板) |
(C++11) | 抛出 std::nested_exception 中的异常 (函数模板) |
[编辑]注解
功能特性测试宏 | 值 | 标准 | 功能特性 |
---|---|---|---|
__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) | 处理异常对象的共享指针类型 (typedef) |
(C++11) | 抛出实参,带上混入的 std::nested_exception (函数模板) |
(C++11) | 抛出 std::nested_exception 中的异常 (函数模板) |