2010-03-14 7 views
7

초기화 목록에서 예외를 잡는 방법에 대한 질문이 있습니다.초기화 목록에서 예외를 잡는 방법?

예를 들어, 우리는 내가이 개체를 만드는 절차에 의해 잡힐 것으로 판단 바

class Foo { 

public: 
Foo(int i) {throw 0; } 

} 

class Bar : public Foo{ 

public: 

Bar() : Foo(1) {} 

} 

답변

10

나는 (당신이 그것을 잡은 후에는 어떻게 할 건데 무엇 호출자에 그런 일을 잡기 위해 더 나은 비록. 그리고?) 구문이 this처럼 생각

Bar::Bar() 
try 
    : Foo(1) 
{ 
} 
catch(const SomeException &e) 
{ 
} 
+5

우와, 이상하게 보이는 코드입니다. –

+3

예외를 무시하는 데 사용할 수 없습니다. 'catch' 블록이 자신의 예외를 throw하지 않으면 원래 예외가 자동으로 다시 발생합니다 (자세한 내용은 링크 된 GOTW를 참조하십시오). – sth

+0

@sth : 확실히 할 수 있습니다. – Potatoswatter

1

에서 파생 된 클래스의 푸 있습니다.

6

C++이 수행하는 메커니즘을 가지고 그래서, 거의 사용되지 않습니다.

Bar::Bar() 
try 
    : Foo(1) 
{ 
} 
catch(Something) 
{ 
} 

유일한 예외를 변환하는 데 사용되어야하는 이유 설명이 고전 gotw을, (예를 들어, 예외 유형의 FooException이 BarException된다) 참조 :이 기능 try 블록이다.

+1

항상 참조를 잡으십시오. – Potatoswatter

0

문제가있는 인스턴스를 boost::optional으로 바꾸는 것을 고려하십시오. 그런 다음 초기화를 생성자 본문으로 지연 할 수 있습니다.

관련 문제