“cpp/error/throw with nested”的版本间的差异

来自cppreference.com
< cpp‎ | error
(Translated from the English version using Google Translate)
 
(未显示5个用户的8个中间版本)
第1行: 第1行:
{{tr_note}}
 
 
{{cpp/title|throw_with_nested}}
 
{{cpp/title|throw_with_nested}}
 
{{cpp/error/navbar}}
 
{{cpp/error/navbar}}
 
+
{{|header=exception|sincec++11|
{{ddcl | header=exception | notes={{mark since c++11}} |
+
 
template< class T >
 
template< class T >
 
[[noreturn]] void throw_with_nested( T&& t );
 
[[noreturn]] void throw_with_nested( T&& t );
 
}}
 
}}
  
{{tr|来自都{{c|std::nested_exception}}和{{c|std::remove_reference<T>::type}} 构建从{{c|std::forward<T>(t)}} 抛出一个异常的类型不明确。默认的构造函数的父​​的nested_exception调用{{c|std::current_exception}} ,捕捉当前处理 异常对象,如果有的话 ,{{c|std::exception_ptr}}. |Throws an exception of unspecified type that is derived from both {{c|std::nested_exception}} and from {{c|std::remove_reference<T>::type}}, and constructed from {{c|std::forward<T>(t)}}. The default constructor of the nested_exception parent calls {{c|std::current_exception}}, capturing the currently handled exception object, if any, in {{c|std::exception_ptr}}. }}
+
{{c|std::<T>::type}} , {{|std::}} {{|std::}} 的 , {{|std::nested_exception}} {{c|std::<T>::type}} {{c|std::forward<T>(t)}} nested_exception{{|std::current_exception}} {{|std::exception_ptr}}
  
{{tr|{{c|std::remove_reference<T>::type}}来自{{c|std::nested_exception}},简单地 抛出{{c|std::forward<T>(t)}}.|If {{c|std::remove_reference<T>::type}} is already derived from {{c|std::nested_exception}}, simply throws {{c|std::forward<T>(t)}}.}}
+
抛出 {{c|std::forward<T>(t)}}
  
{{tr|需 要{{c|std::remove_reference<T>::type}} {{concept|CopyConstructible}}|Requires that {{c|std::remove_reference<T>::type}} is {{concept|CopyConstructible}}}}
+
要 {{c|std::<T>::type}} {{|CopyConstructible}}
  
 
===参数===
 
===参数===
{{param list begin}}
+
{{begin}}
{{param list item | t |{{tr| 抛出的异常对象| the exception object to throw}}}}
+
{{| t |  抛出的异常对象
{{param list end}}
+
 +
 
 +
 +
 +
|}} }}
 +
{{end}}
  
=== 返回值===
+
=== ===
{{tr| (无)|(none)}}
+
{{| }}
  
=== 为例===
+
=== ===
{{example template | cpp/error/example_nested_exception}}
+
{{
 +
| cpp/error/
 +
 +
}}
  
===另请参阅===
+
{{||}}
{{dcl list begin}}
+
{{dcl list template | cpp/error/dcl list nested_exception}}
+
{{dcl list template | cpp/error/dcl list rethrow_if_nested}}
+
{{dcl list end}}
+

2024年11月26日 (二) 00:07的最后版本

在标头 <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_exceptions 202411L (C++26) constexpr 的异常类型

[编辑] 示例

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

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

可能的输出:

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

[编辑] 参阅

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