命名空间
变体
操作

std::current_exception

来自 cppreference.com
< cpp‎ | error
在头文件 <exception> 中定义
std::exception_ptr current_exception() noexcept;
(自 C++11 起)

如果在异常处理期间调用(通常在 catch 子句中),则捕获当前异常对象并创建一个 std::exception_ptr,它持有对该异常对象的副本或引用的引用(取决于实现)。引用的对象至少在存在引用它的 exception_ptr 对象时有效。

如果此函数的实现需要调用 new 并且调用失败,则返回的指针将保存对 std::bad_alloc 实例的引用。

如果此函数的实现需要复制捕获的异常对象,并且其复制构造函数抛出异常,则返回的指针将保存对抛出异常的引用。如果抛出异常对象的复制构造函数也抛出异常,则返回的指针可能会保存对 std::bad_exception 实例的引用以打破无限循环。

如果在没有处理异常的情况下调用该函数,则返回一个空的 std::exception_ptr

此函数可以在 std::terminate_handler 中调用以检索导致调用 std::terminate 的异常。

内容

[编辑] 参数

(无)

[编辑] 返回值

一个 std::exception_ptr 实例,持有对异常对象的引用,或者异常对象的副本,或者对 std::bad_alloc 实例的引用,或者对 std::bad_exception 实例的引用。

[编辑] 注意事项

在遵循 Itanium C++ ABI 的实现(GCC、Clang 等)中,异常在抛出时分配在堆上(在某些情况下除 std::bad_alloc 外),此函数只创建引用先前分配对象的智能指针。在 MSVC 中,异常在抛出时分配在堆栈上,此函数执行堆分配并复制异常对象。

在托管 CLR 环境下的 Windows 中 [1],当当前异常是托管异常时,实现将存储一个 std::bad_exception ([2])。请注意,catch(...) 也会捕获托管异常

#include <exception>
 
int main()
{
    try
    {
        throw gcnew System::Exception("Managed exception");
    }
    catch (...)
    {
        std::exception_ptr ex = std::current_exception();
        try
        {
            std::rethrow_exception(ex);
        }
        catch (std::bad_exception const &)
        {
            // This will be printed.
            std::cout << "Bad exception" << std::endl;
        }
    }
}

[编辑] 示例

#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>
 
void handle_eptr(std::exception_ptr eptr) // passing by value is OK
{
    try
    {
        if (eptr)
            std::rethrow_exception(eptr);
    }
    catch(const std::exception& e)
    {
        std::cout << "Caught exception: '" << e.what() << "'\n";
    }
}
 
int main()
{
    std::exception_ptr eptr;
 
    try
    {
        [[maybe_unused]]
        char ch = std::string().at(1); // this generates a std::out_of_range
    }
    catch(...)
    {
        eptr = std::current_exception(); // capture
    }
 
    handle_eptr(eptr);
 
} // destructor for std::out_of_range called here, when the eptr is destructed

可能的输出

Caught exception: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'

[编辑] 参见

用于处理异常对象的共享指针类型
(typedef) [编辑]
std::exception_ptr 中抛出异常
(函数) [编辑]
从异常对象创建 std::exception_ptr
(函数模板) [编辑]
(C++20 中已删除*)(C++17)
检查是否正在进行异常处理
(函数) [编辑]