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.
Примечания
В реализациях, следующих ABI Itanium C++ (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 &)
{
// This will be printed.
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) // 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) | тип разделяемого указателя для обработки объектов исключений (псевдоним типа) |
|
(C++11) | выбрасывает исключение из std::exception_ptr (функция) |
|
(C++11) | создает std::exception_ptr из объекта исключения (шаблон функции) |
|
(удалена в C++20*)(C++17) | проверяет, выполняется ли в данный момент обработка исключения (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/error/current_exception