12

초기화에서 예외가 발생할 수 있다고 생각합니다. 그래서 try/catch 블록을 작성합니다.초기화/시도의 초기화 목록은 어떻게 작동합니까?

int f(){ 
    throw 1; 
} 

class A 
{ 
public: 
    A() try : _k(f()) 
    {} 
    catch (int) 
    { 
     std::cout << "Exception 1" << std::endl; 
    } 

private: 
    int _k; 
}; 

그러나 catch는 한 수준 더 예외를 rethrows. 그게 의미 다음 코드가

try 
{ 
    A a; 
} catch(int) 
{ 
    std::cout << "Exception 2" << std::endl; 
} 

출력됩니다 :

Exception 1 
Exception 2 

이 try/catch 블록은 같은 방법으로 보통 try/catch 블록을하지 동작하는 이유는 무엇입니까?

전체 코드 예제 : http://ideone.com/XjY2d 당신이 건설하고있는 객체가 정말 구축되지 않은

답변

16

질문 : 왜 함수 수준의 try/catch가 자동으로 exceptoin을 다시 throw합니까? 개체의 구성에서 예외를 던지면서이 개체는 수명이 다하기 전에 죽은 것으로 간주됩니다. 모든 하위 객체가 파괴됩니다. 즉, 구축 중에 예외가 Throw되었을 경우, 객체는 존재하지 않습니다. 예외가 발생하지 않는다면 객체의 선체를 손에 넣을 수 있습니다. 이것은 분명히 바람직하지 않습니다.

+1

메모 : 'catch'블록을 빠져 나오지 않으면 자동으로 다시 시작됩니다. –

2

, 너무 간단 복귀를 선택할 수 없습니다. 이런 종류의 try0-catch는 항상 rethrows입니다 (catch 절에서 예외를 던지지 않는 한).

2

일반적인 try-catch 블록이 아니고 기능 수준 try/catch이기 때문에. throw을 사용하여 명시 적으로 지정하지 않으면 자동으로 다시 읽습니다.

+0

이것이 일반 블록이 아니라는 것을 알고 있습니다. 그러나 나는 그런 식으로 일하기로 결정한 방법을 알고 싶습니다. – Seagull

+0

그런 다음 질문의 굵은 텍스트를 분명히 할 수 있습니다. 다른 사람들은 주요한 아이디어가 호출자를 고려할 때, 객체가 생성하는데 실패했다는 것을 지적했다. 구성 중 오류를 알리는 유일한 방법은 예외입니다. – Xyand

관련 문제