2013-06-12 2 views
1

아래 코드에서 특별한 처리 순서가 어떻게 발생하는지 설명해주십시오. 이C++ Exceptional handling queries

로 평가 했는가

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

class E { 
public: 
    const char* error; 
    E(const char* arg): error(arg) {} 
}; 

class B { 
public: 
    B() {}; 
    ~B(){cout<<"~B() called"<<endl;} 
}; 

class D: public B { 
public: 
    D(); 
    ~D() { cout<<"~D() called"<<endl; } 
}; 

D::D() try :B(){ 
    throw E("Exception in D"); 
} catch(E&e) 
{ 
    cout<<"Handler of function try block of D()"<<e.error<<endl; 
}; 

int main() 
{ 
    try { 
     D val; 
    }catch(...) {} 
} 
+0

설명해주세요. 무엇에 관해서 설명해주세요. –

답변

2

다른 클래스에서 파생 된 클래스의 개체를 구성하면 기본 클래스의 생성자가 파생 생성자 본문 전에 (명시 적으로 또는 암시 적으로) 호출됩니다. D의 생성자 본문에 예외가 발생했습니다. B은이 시점에서 이미 생성되었습니다. 예외가 전파되면 B의 소멸자가 호출되어 부분적으로 구성된 객체를 파괴합니다.

note의 두 번째 동작은 다시 throw 된 예외입니다. 생성자에 대한 함수 try 블록은 항상 예외를 rethrow합니다. 예외는 무시할 수 없습니다. 만약 그렇다면, 당신의 대상은 이미 파괴 된 B으로 남을 것입니다. 자세한 내용은 GotW #66을 참조하십시오.

0

B get 및의의 생성자에서 Try 블록 생성 "~ B() D() D의 예외의 기능 try 블록의 핸들러를 소위" D.이 throw 문은 소멸자에 의해 제거 할 try 블록의 원인 B의 실행을 종료 :

~B() called 

실제로 여기에 줄 바꿈이 있어야한다 (당신은을받지 않거나은 생략 했습니까?). 그런 다음 던져진 객체 E가 catch 블록에 들어가 화면에 출력됩니다.

Handler of function try block of D()Exception in D 

그런가요?

0

생성자가 캐치되지 않은 예외를 throw하면 기본 클래스가 자동으로 파기됩니다 (생성자 본문이 입력되기 전에 성공적으로 구성되기 때문에). 따라서 ~B()은 예외 핸들러가 예외를 포착하기 전에 호출됩니다.