Spec-Zone.ru › C++

std::current_exception

Определено в заголовке <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.

Примечания

В реализациях, следующих ABI Itanium C++ (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;
        }
    }
}
Макрос проверки поддержки возможности Значение Стандарт Возможность
__cpp_lib_constexpr_exceptions 202411L (C++26) constexpr для типов исключений

Пример

#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)'

См. также

exception_ptr
(C++11)
тип разделяемого указателя для обработки объектов исключений
(псевдоним типа)
rethrow_exception
(C++11)
выбрасывает исключение из std::exception_ptr
(функция)
make_exception_ptr
(C++11)
создает std::exception_ptr из объекта исключения
(шаблон функции)
uncaught_exceptionuncaught_exceptions
(удалена в C++20*)(C++17)
проверяет, выполняется ли в данный момент обработка исключения
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/current_exception

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API