std::current_exception
Определено в заголовочном файле <exception>
|
||
std::exception_ptr current_exception() noexcept; |
(начиная с C++11) | |
Если вызывается во время обработки исключения (обычно в предложении 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 исключения выделяются в стеке при создании, и эта функция выполняет выделение в куче и копирование объекта исключения.
В Windows в управляемых средах CLR [1] реализация будет хранить std::bad_exception, когда текущее исключение является управляемым исключение ([2]). Обратите внимание, что catch(...) также перехватывает управляемые исключения:
#include <exception> int main() { try { throw gcnew System::Exception("Управляемое исключение"); } catch (...) { std::exception_ptr ex = std::current_exception(); try { std::rethrow_exception(ex); } catch (std::bad_exception const &) { // Это будет выведено на экран. std::cout << "Плохое исключение" << std::endl; } } }
[править] Пример
#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 (функция) |
(C++11) |
создаёт std::exception_ptr из объекта исключения (шаблон функции) |
(удалено в C++20)(C++17) |
проверяет, выполняется ли в настоящее время обработка исключений (функция) |