Spec-Zone.ru › C++

std::current_exception

Определено в заголовке <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
    {
        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)
тип общего указателя для обработки объектов исключений
(typedef)
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/w/cpp/error/current_exception

Spec-Zone.ru

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