std::rethrow_exception
Определён в заголовочном файле <exception> | ||
|---|---|---|
[[noreturn]] void rethrow_exception( std::exception_ptr p ); |
(начиная с C++11) (constexpr начиная с C++26) |
Выбрасывает ранее сохранённый объект исключения, на который указывает указатель исключения p, или копию этого объекта.
Не определено, будет ли создана копия. Если копия создаётся, память для неё выделяется неуказанным способом.
Поведение не определено, если p равен null.
Параметры
| 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) // 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
{
[[maybe_unused]]
char ch = 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/cpp/error/rethrow_exception