如何在析构函数期间检测到异常是否处于活动状态?

Wil*_*mKF 2 c++ destructor exception stack-unwinding

在C ++中,我如何在析构函数的主体中检测是否由于抛出异常而取消了堆栈的堆栈?一旦检测到,是否可以引用活动异常?

我之所以问是因为我想添加一些调试代码来解释为什么可能会出现某种情况以及它是否是由于异常引起的。

Ste*_*sop 5

std::uncaught_exception 告诉您堆栈是否由于抛出异常而被解绕,这就是您所要求的。

但是,它并没有告诉您您可能想知道的内容:您从中调用其析构函数的对象是处于正在解卷的堆栈部分中,还是由于非重载而通常被破坏的堆栈部分异常退出正在展开的其他某些析构函数下的作用域:

struct A {
    ~A();
};

struct B {
    ~B();
}

int main() {
    try {
        A a;
        throw 1;
    } catch(...) {}
}

A::~A() {
    std::uncaught_exception(); // true
    B b;
}

B::~B() {
    std::uncaught_exception(); // also true, but "b" isn't being "unwound",
      // because ~A() returned, it didn't throw.
}
Run Code Online (Sandbox Code Playgroud)

与DeadMG和Xeo所说的相反,您无法获得对尚未捕获的异常的引用。throw没有操作数的对象将抛出“当前处理的异常”,即您所在的捕获处理程序或其捕获处理程序已调用您的异常。它不会抛出未捕获的异常。