std:: current_exception
|
Определено в заголовке
<exception>
|
||
|
std::
exception_ptr
current_exception
(
)
noexcept
;
|
(начиная с C++11)
(constexpr начиная с C++26) |
|
Если вызывается во время обработки исключения (обычно в
catch
блоке), захватывает текущий объект исключения и создает
std::exception_ptr
, который содержит либо копию, либо ссылку на этот объект исключения (в зависимости от реализации). Референсный объект остается действительным как минимум до тех пор, пока существует объект
exception_ptr
, который ссылается на него.
Если реализация этой функции требует вызова new и вызов завершается неудачей, возвращаемый указатель будет содержать ссылку на экземпляр std::bad_alloc .
Если реализация этой функции требует копирования перехваченного объекта исключения и его конструктор копирования выбрасывает исключение, возвращаемый указатель будет содержать ссылку на выброшенное исключение. Если конструктор копирования выброшенного объекта исключения также выбрасывает исключение, возвращаемый указатель может содержать ссылку на экземпляр std::bad_exception для прерывания бесконечного цикла.
Если функция вызывается, когда никакое исключение не обрабатывается, возвращается пустой std::exception_ptr .
Эта функция может быть вызвана в std::terminate_handler для получения исключения, которое вызвало обращение к std::terminate .
Содержание |
Возвращаемое значение
Экземпляр std::exception_ptr , содержащий ссылку на объект исключения, или копию объекта исключения, или на экземпляр std::bad_alloc , или на экземпляр std::bad_exception .
Примечания
В реализациях, следующих Itanium C++ ABI (GCC, Clang и др.), исключения выделяются в куче при выбрасывании (за исключением std::bad_alloc в некоторых случаях), и эта функция просто создает умный указатель, ссылающийся на ранее выделенный объект. В MSVC исключения выделяются в стеке при выбрасывании, и эта функция выполняет выделение в куче и копирование объекта исключения.
В управляемых средах CLR на Windows [1] , реализация будет сохранять std::bad_exception , когда текущее исключение является управляемым исключением ( [2] ). Обратите внимание, что catch ( ... ) также перехватывает управляемые исключения:
#include <exception> int main() { try { throw gcnew System::Exception("Managed exception"); } catch (...) { std::exception_ptr ex = std::current_exception(); try { std::rethrow_exception(ex); } catch (std::bad_exception const &) { // Это будет напечатано. std::cout << "Bad exception" << std::endl; } } }
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__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)'
Смотрите также
|
(C++11)
|
тип умного указателя для обработки объектов исключений
(typedef) |
|
(C++11)
|
выбрасывает исключение из
std::exception_ptr
(функция) |
|
(C++11)
|
создает
std::exception_ptr
из объекта исключения
(шаблон функции) |
|
(
удален в C++20*
)
(C++17)
|
проверяет, выполняется ли в данный момент обработка исключений
(функция) |