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.
}
Вопреки тому, что говорят DeadMG и Xeo, вы не можете получить ссылку на исключение, которое не было обнаружено. throw
без операнда сбрасывает «текущее обработанное исключение», то есть исключение, в обработчике которого вы находитесь или чей-обработчик вызвал вас. Это не отбрасывает неисследованное исключение.