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

来自cppreference.com
< cpp‎ | error
(Use {{lc}}. Update links. Various fixes.)
 
(未显示4个用户的5个中间版本)
第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|来自都{{lc|std::nested_exception}}和{{c|std::remove_reference<T>::type}} 构建从{{c|std::forward<T>(t)}} 抛出一个异常的类型不明确。默认的构造函数的父​​的nested_exception调用{{lc|std::current_exception}} ,捕捉当前处理 异常对象 如果有的话,{{lc|std::exception_ptr}}. |Throws an exception of unspecified type that is derived from both {{lc|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 {{lc|std::current_exception}}, capturing the currently handled exception object, if any, in {{lc|std::exception_ptr}}. }}
+
{{c|std::<T>::type}} , {{|std::}} {{lc|std::}} 的 , {{lc|std::nested_exception}} {{c|std::<T>::type}} {{c|std::forward<T>(t)}} nested_exception{{lc|std::current_exception}} {{lc|std::exception_ptr}}
  
{{tr|{{c|std::remove_reference<T>::type}}来自{{lc|std::nested_exception}},简单地 抛出{{c|std::forward<T>(t)}}.|If {{c|std::remove_reference<T>::type}} is already derived from {{lc|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}}
  
 
===参数===
 
===参数===
 
{{par begin}}
 
{{par begin}}
{{par | t |{{tr| 抛出的异常对象| the exception object to throw}}}}
+
{{par | t |  抛出的异常对象}}
 
{{par end}}
 
{{par end}}
  
=== 返回值===
+
=== ===
{{tr| (无)|(none)}}
+
{{
 +
||
 +
}}
  
=== 例===
+
=== 例===
{{example template | cpp/error/example_nested_exception}}
+
{{| cpp/error/example_nested_exception}}
  
=== 另请 参阅===
+
===参阅===
 
{{dsc begin}}
 
{{dsc begin}}
 
{{dsc inc | cpp/error/dsc nested_exception}}
 
{{dsc inc | cpp/error/dsc nested_exception}}
第31行: 第31行:
 
{{dsc end}}
 
{{dsc end}}
  
[[de:cpp/error/throw with nested]]
+
deenesfritjaptru
[[en:cpp/error/throw with nested]]
+
[[es:cpp/error/throw with nested]]
+
[[fr:cpp/error/throw with nested]]
+
[[it:cpp/error/throw with nested]]
+
[[ja:cpp/error/throw with nested]]
+
[[pt:cpp/error/throw with nested]]
+
[[ru:cpp/error/throw with nested]]
+

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 中的异常
(函数模板) [编辑]