C++에서 예외가 발생하여 스택이 해제되는지 여부를 소멸자 본문에서 어떻게 감지 할 수 있습니까? 일단 발견되면, 활성 예외에 대한 참조를 얻을 수 있습니까?소멸자 중에 예외가 활성화되어 있는지 어떻게 알 수 있습니까?
특정 상황이 발생할 수있는 이유와 예외로 인한 것인지 여부를 설명하는 디버깅 코드를 추가하고 싶습니다.
C++에서 예외가 발생하여 스택이 해제되는지 여부를 소멸자 본문에서 어떻게 감지 할 수 있습니까? 일단 발견되면, 활성 예외에 대한 참조를 얻을 수 있습니까?소멸자 중에 예외가 활성화되어 있는지 어떻게 알 수 있습니까?
특정 상황이 발생할 수있는 이유와 예외로 인한 것인지 여부를 설명하는 디버깅 코드를 추가하고 싶습니다.
std::uncaught_exception
은 예외가 발생하여 스택이 풀려나는지 여부를 알려줍니다. 이는 사용자가 요청한 것입니다.
그러나 당신이 알고 싶은 것을 말하지는 않습니다 : 소멸자를 호출 한 객체가 unwound되고있는 스택 부분에 있는지 또는 정상적으로 파괴되고있는 스택 부분에 있는지 때문에 비 예외적으로 언 와인드의 일부 다른 소멸자 아래 범위를 종료하려면 다음 DeadMG와 Xeo의 말에
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.
}
는 달리, 당신은 적발되지 않은 예외에 대한 참조를 얻을 수 없습니다. throw
피연산자가없는 경우 "현재 처리 된 예외"를 다시 발생시킵니다. 즉, catch-handler가있는 예외 또는 catch-handler가 호출 한 예외를 다시 발생시킵니다. 잡히지 않는 예외를 다시 범하지 않습니다.
그것이 내가 작동하지 않는 것에 대해 생각한 것입니다. 확인해 주셔서 감사합니다. – WilliamKF
"예외가 발생하여 ** 스택이 해제됩니다."글쎄, 때로는 ** 실제로 ** 스택 **이 두 개 있습니다. 하나는 풀고 하나는 파괴 된 객체의 소멸자가 사용하는 스택입니다. ** ** 풀기 때문에. – curiousguy
C++에서 예외가 발생하여 스택이 해제되는지 여부를 내 소멸자 본문에서 어떻게 감지 할 수 있습니까?
.
일단 감지되면 활성 예외에 대한 참조를 얻을 수 있습니까?
호
는 std::uncaught_exception()
기능이있다. 그러나 예외 객체에 액세스하려고 시도 할 수있는 유일한 유용한 방법은 다시 던져서 잡으려고 시도하는 것입니다. 일반적으로 소멸자로부터 예외를 던져서는 안됩니다.
잡히지 않은 예외를 어떻게 다시 제시 할 수 있습니까? – WilliamKF
'try {throw; } – Xeo
"std :: uncaught_exception() 함수가 있습니다 ._"는 질문에 대답하지 않습니다. – curiousguy
지금 당장은 [GoTW # 47] (http://www.gotw.ca/gotw/047.htm)을 읽는 것이 정말 즐겁습니다. –
건설은 실패 할 수 있지만 파괴는 결코 불가능할 수 있습니다. 객체 파기 중에는 예외 처리 메커니즘을 가질 필요가 없습니다. – Mahesh
@Mahesh 나는 당신이 그 질문에 대해 오해했다고 생각합니다. 소멸자의 예외 처리가 아니라 객체의 주변 범위에 예외가 발생하여 소멸자가 호출되는지 여부를 감지하는 데 있습니다. –