Namespaces
Variants

std:: current_exception

From cppreference.net
Определено в заголовке <exception>
std:: exception_ptr current_exception ( ) noexcept ;
(начиная с C++11)
(constexpr начиная с C++26)

Если вызывается во время обработки исключения (обычно в 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 &)
        {
            // Это будет напечатано.
            std::cout << "Bad exception" << std::endl;
        }
    }
}
Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr для типов исключений

Пример

#include <exception>
#include <iostream>
#include <stdexcept>
#include <string>
void handle_eptr(std::exception_ptr eptr) // передача по значению допустима
{
    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); // это генерирует std::out_of_range
    }
    catch(...)
    {
        eptr = std::current_exception(); // захват
    }
    handle_eptr(eptr);
} // деструктор для std::out_of_range вызывается здесь, когда eptr уничтожается

Возможный вывод:

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)
проверяет, выполняется ли в данный момент обработка исключений
(функция)