std::current_exception
来自 cppreference.com
在头文件 <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 中,异常在抛出时分配在堆栈上,此函数执行堆分配并复制异常对象。
在托管 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; } } }
[编辑] 示例
运行此代码
#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 中抛出异常 (函数) |
(C++11) |
从异常对象创建 std::exception_ptr (函数模板) |
(C++20 中已删除*)(C++17) |
检查是否正在进行异常处理 (函数) |