Пространства имён
Варианты
Действия

std::rethrow_exception

Материал из cppreference.com
< cpp‎ | error
 
 
Библиотека диагностики
Обработка исключений
rethrow_exception
(C++11)
Сбои обработки исключений
(до C++17*)
(до C++17*)
(C++11)(до C++17*)    
(до C++17*)
Коды ошибок
Коды ошибок
Категории исключений
(ТС TM)
Поддержка системных ошибок
(C++11)
(C++11)
Утверждения
Трассировка стека
 
Определено в заголовочном файле <exception>
[[noreturn]] void rethrow_exception( std::exception_ptr p );
(начиная с C++11)

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

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

Поведение не определено, если p равно null.

Содержание

[править] Параметры

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

[править] Возвращаемое значение

(нет)

[править] Исключения

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

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

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

[править] Примечание

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

[править] Пример

#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 << "Поймано исключение: '" << e.what() << "'\n";
    }
}
 
int main()
{
    std::exception_ptr eptr;
 
    try
    {
        std::string().at(1); // это генерирует std::out_of_range
    }
    catch(...)
    {
        eptr = std::current_exception(); // захват
    }
 
    handle_eptr(eptr);
 
} // здесь вызывается деструктор для std::out_of_range,
  // когда уничтожается eptr

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

Поймано исключение: 'basic_string::at: __n (which is 1) >= this->size() (which is 0)'

[править] Смотрите также

тип общего указателя для обработки объектов исключений
(определение типа) [править]
фиксирует текущее исключение в std::exception_ptr
(функция) [править]