2010-04-17 3 views
2

생성자 예외를 잡는 방법을 이해하지 못하는 것 같습니다. 다음은 관련 코드입니다 :C++ catch 생성자 예외

 struct Thread { 
      rysq::cuda::Fock fock_; 
      template<class iterator> 
      Thread(const rysq::cuda::Centers &centers, 
        const iterator (&blocks)[4]) 
       : fock_() 
      { 
       if (!fock_) throw; 
      } 
     }; 

     Thread *ct; 
     try { ct = new Thread(centers_, blocks); } 
     catch(...) { return false; } // catch never happens, 

그래서 catch 문이 실행되지 않고 나는 예외가 처리되지 않은 얻을. 내가 뭘 잘못 했니? 이것은 g ++를 사용하는 똑 바른 C++입니다.

+0

'! fock_' *이 실제로'true'로 평가 될 수 있는지 확인 했습니까? 어쩌면 당신은 단순히 처음부터 예외를 던지지 않았을 것입니다 ... – stakx

+0

@stakx 예외가 throw되지만 catch되지 않습니다. 나는 명시 적 예외를 던져야한다는 것을 몰랐다. – Anycorn

답변

8

은 이제 더 피연산자

throw std::exception(); 

throwcatch 블록에 의해 처리되는 예외를 다시 발생하는 catch 블록 내에서 사용되며, 예를 들어, 객체를 발생한다.

+0

사소한 단점 : 대상 일 필요는 없습니다. 프리미티브도 괜찮습니다. –

+3

@Billy : C++에서 기본도 객체입니다. 객체는 단순히 "저장 영역"입니다 (언어 표준의 시작 부분에 있습니다). –

+0

답장을 주셔서 감사합니다. – Anycorn

3

무엇이든 잡으려면 뭔가를 던져야합니다.

if (!fock_) throw ""; 

에 광고

if (!fock_) throw; 

변경 시도하고 그 차이를 관찰한다.

+0

답변 해 주셔서 감사합니다. – Anycorn

3

뭔가를 던져야합니다. throw은 현재 예외를 "다시 throw"하는 것을 의미합니다. 현재 예외가 없으면 unexpected이 호출되어 프로그램을 중단합니다.

문제를 설명하는 <stdexcept>에서 수업을 선택하는 것이 가장 좋습니다. logic_error 또는 프로그래밍 실수를 나타내는 미분 또는 예외적 인 조건을 나타내는 runtime_error.