2011-11-01 4 views
1

C++에서 예외가 발생하여 스택이 해제되는지 여부를 소멸자 본문에서 어떻게 감지 할 수 있습니까? 일단 발견되면, 활성 예외에 대한 참조를 얻을 수 있습니까?소멸자 중에 예외가 활성화되어 있는지 어떻게 알 수 있습니까?

특정 상황이 발생할 수있는 이유와 예외로 인한 것인지 여부를 설명하는 디버깅 코드를 추가하고 싶습니다.

+3

지금 당장은 [GoTW # 47] (http://www.gotw.ca/gotw/047.htm)을 읽는 것이 정말 즐겁습니다. –

+0

건설은 실패 할 수 있지만 파괴는 결코 불가능할 수 있습니다. 객체 파기 중에는 예외 처리 메커니즘을 가질 필요가 없습니다. – Mahesh

+1

@Mahesh 나는 당신이 그 질문에 대해 오해했다고 생각합니다. 소멸자의 예외 처리가 아니라 객체의 주변 범위에 예외가 발생하여 소멸자가 호출되는지 여부를 감지하는 데 있습니다. –

답변

4

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가 호출 한 예외를 다시 발생시킵니다. 잡히지 않는 예외를 다시 범하지 않습니다.

+0

그것이 내가 작동하지 않는 것에 대해 생각한 것입니다. 확인해 주셔서 감사합니다. – WilliamKF

+0

"예외가 발생하여 ** 스택이 해제됩니다."글쎄, 때로는 ** 실제로 ** 스택 **이 두 개 있습니다. 하나는 풀고 하나는 파괴 된 객체의 소멸자가 사용하는 스택입니다. ** ** 풀기 때문에. – curiousguy

0

C++에서 예외가 발생하여 스택이 해제되는지 여부를 내 소멸자 본문에서 어떻게 감지 할 수 있습니까?

.

일단 감지되면 활성 예외에 대한 참조를 얻을 수 있습니까?

0

std::uncaught_exception() 기능이있다. 그러나 예외 객체에 액세스하려고 시도 할 수있는 유일한 유용한 방법은 다시 던져서 잡으려고 시도하는 것입니다. 일반적으로 소멸자로부터 예외를 던져서는 안됩니다.

+0

잡히지 않은 예외를 어떻게 다시 제시 할 수 있습니까? – WilliamKF

+0

'try {throw; } – Xeo

+0

"std :: uncaught_exception() 함수가 있습니다 ._"는 질문에 대답하지 않습니다. – curiousguy