2013-03-22 13 views
2

C++에서 예외를 가지고 놀았을 때, 나는 여기서 누군가가 설명 할 수 있기를 바랬던 흥미로운 행동을 알아 차렸다. 아래 코드를 살펴보십시오.예외 예외 발생

class Foo 
{ 
public: 

    Foo() 
    { 
     throw 0; 
    } 
}; 

class RandomException 
{ 
public: 

    Foo f; 
}; 

void bar() 
{ 
    throw RandomException(); 
} 

// Case #1 
int main() 
{ 
    bar(); 
    return 0; 
} 

위의 경우 처리되지 않은 예외가 있습니다. 나는에 main 함수의 본문을 변경하면 현재 :

// Case #2 
int main() 
{ 
    try 
    { 
     bar(); 
    } 
    catch (int) 
    { 
    } 

    return 0; 
} 

나는 예외를 삼키는거야. 처리되지 않은 예외는 없으며 코드가 제대로 실행됩니다. 코드를 다음과 같이 변경하면

// Case #3 
int main() 
{ 
    try 
    { 
     bar(); 
    } 
    catch (RandomException&) 
    { 
    } 

    return 0; 
} 

다시 처리되지 않은 예외가 발생합니다.

케이스 2의 경우 처리되지 않은 예외가없는 이유를 알고 싶습니다. 케이스 # 3에서는 두 가지 예외가 있습니다. 하나는 int이고 다른 하나는 RandomException입니다.

예외를 throw하는 동안 예외가 throw 될 때 C++이 어떻게 처리합니까? 여기

+1

왜 맞춤 예외 클래스의 _inside_ 예외가 발생합니까? 그건 미친 짓이야. RandomException의 생성자는 throw되는 Foo의 생성자를 호출하고 case 3이 아닌 case 2에서만 해당 예외를 catch합니다. – stefan

+0

[The Daily WTF] (http://thedailywtf.com/Articles/Crashception.aspx) . 8v) –

+0

@stefan 물론 과학을 위해서. 왜 또? – Zeenobit

답변

4

RandomException 객체의 구성은 예외 실패 때문에 throw RandomException() 완료 결코 및 int (0) (RandomException를 구성하는 과정에서) 발생된다.

핸들러가있는 경우 (# 2와 마찬가지로) 컨트롤이 해당 핸들러로 전송됩니다. 그렇지 않은 경우 (# 3)와 같이 std::terminate()이 호출됩니다.

+0

그래서'RandomException'의 생성이 결코 "완료"되지 않기 때문에 절대 던지지 않을 것입니까? – Zeenobit

+0

@Zeenobit : 실제로 그런 일이 일어나고 있습니다. –