是否应该在堆栈展开期间销毁的对象的析构函数中使用std::current_exception?
Documentation on cppreference说:
但是对于我来说不清楚堆栈展开是否是异常处理的一部分。
在stackoverflow上的一些highest-ranked answer中,作者假设这是可能的。
我在编译器(g++(Ubuntu 4.8.2-19ubuntu1)4.8.2)上进行了一些测试,在这种情况下,似乎std::current_exception返回空指针。
#include <exception>
#include <stdexcept>
#include <iostream>
struct A
{
~A()
{
std::clog << "in destructor"<<std::endl;
std::clog << "uncaught_exception: " << std::uncaught_exception() << std::endl;
std::clog << "current_exception: " << (bool)std::current_exception() << std::endl;
}
};
int main(int argc, char **)
{
try
{
A aa;
std::clog << "before throw"<<std::endl;
if(argc>1)
throw std::runtime_error("oh no");
}
catch(...)
{
std::clog << "in catch block"<<std::endl;
std::clog << "uncaught_exception: " << std::uncaught_exception() << std::endl;
std::clog << "current_exception: " << (bool)std::current_exception() << std::endl;
}
return 0;
}
输出为:
before throw
in destructor
uncaught_exception: 1
current_exception: 0
in catch block
uncaught_exception: 0
current_exception: 1
有人知道标准怎么说吗?
最佳答案
C++标准在第18.8.5节[传播]中定义 current_exception()
:
(强调我的)
以及第15.3节[句柄除外],注释7和8:
current_exception()
返回的异常被定义为“当前处理的异常”,这是最新 Activity 的处理程序的异常,并且仅当堆栈展开操作完成时,处理程序才处于 Activity 状态。
如您的测试所示,在堆栈展开期间没有“ Activity 处理程序”,因此也没有“当前处理的异常”:在这种情况下, current_exception()
将返回空exception_ptr
。