std::rethrow_exception
Определено в заголовке <exception> | ||
|---|---|---|
[[noreturn]] void rethrow_exception( std::exception_ptr p ); | (с C++11) |
Бросает объект ранее перехваченного исключения, на который ссылается указатель исключения p, или копию этого объекта.
Не определено, будет ли создана копия. Если копия создаётся, то выделение памяти для неё происходит неопределённым образом.
Поведение неопределено, если p равно null.
Параметры
| p | - | не null 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) // 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)'
См. также
|
(C++11) | тип общего указателя для обработки объектов исключений (typedef) |
|
(C++11) | перехватывает текущее исключение в std::exception_ptr (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/error/rethrow_exception