std::rethrow_exception
Определено в заголовочном файле <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)'
[править] Смотрите также
(C++11) |
тип общего указателя для обработки объектов исключений (определение типа) |
(C++11) |
фиксирует текущее исключение в std::exception_ptr (функция) |