Namespaces
Variants

std:: rethrow_exception

From cppreference.net
Определено в заголовочном файле <exception>
[ [ noreturn ] ] void rethrow_exception ( std:: exception_ptr p ) ;
(начиная с C++11)
(constexpr начиная с C++26)

Выбрасывает ранее перехваченный объект исключения, на который ссылается указатель исключения p , или копию этого объекта.

Не определено, создаётся ли копия. Если копия создаётся, то память для неё выделяется неопределённым способом.

Поведение не определено, если p является нулевым указателем.

Содержание

Параметры

p - ненулевой std::exception_ptr

Исключения

Объект исключения, на который ссылается p если копия не создается.

В противном случае, копия такого объекта исключения, если реализация успешно скопировала объект исключения.

В противном случае, std::bad_alloc или исключение, выброшенное при копировании объекта исключения, если выделение памяти или копирование завершилось неудачей, соответственно.

Примечания

До P1675R2 , rethrow_exception не разрешалось копировать объект исключения, что невозможно реализовать на некоторых платформах, где объекты исключений размещаются в стеке.

Макрос тестирования возможностей Значение Стандарт Функция
__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
(функция)