2017-11-27 12 views
-2

나는 예외를 던질 수도있는 생성자가있다. 일단 이것이 발생하면 일단 deconstructor가 호출된다. 문제는 개체가 실제로 성공적으로 구성되었는지 확인하는 방법을 찾을 수 없다는 것입니다.C++ 실패한 개체 생성시 실행을 중단하는 방법?

나는

if (objectName) { 
    //keep working 
} else { 
    //alert that something went wrong 
} 

일을 시도하지만 포인터는 항상 존재하지만 당신이하지 않는 무언가를 가리킬 수 있습니다 당신은 자바에서 할 수있는 것처럼 당신이 C++에 "널 (null)"개체를 가질 수 없습니다 것을 알게 필요.

그렇다면 객체 인스턴스화를 추가로 시도해 보았지만 실행이 정상적으로 계속됩니다. 개체가 성공적으로 구성되어 사용할 준비가되었는지 확인하는 가장 좋은 방법은 무엇입니까?

+3

예외가 발생하지 않으면 개체가 완전히 생성됩니다. –

+3

생성자가 throw하는 경우 항상 예외를 catch 할 수 있습니다. 자신이하는 일을 보여주는 실제 코드를 게시하십시오. –

+0

절대적으로해야하지 않는 한 최선의 방법은 버리지 않습니다. 또한 다음 내용을 읽어보십시오. http://www.stroustrup.com/bs_faq2.html#ctor-exceptions –

답변

3
try { 
    Type obj; 
    //keep working 
} 
catch (/* ... */) { 
    //alert that something went wrong 
} 

objtry 블록 내에서만 볼 수있다. 생성자가 throw하는 경우 try 블록을 벗어나므로 obj 블록이 존재하지 않습니다. 따라서 "null 인스턴스"에 대한 개념은 없습니다. obj이 존재하고 유효하며, 예외로 인해 try 블록이 남아 있기 때문에 존재하지 않습니다.

+0

응답 해 주셔서 감사합니다. 실제로는 제 질문의 두 번째 부분에서 제가 매우 저조한 것으로 묘사했을 때 제가 한 일은 무엇입니까. 문제는 try 내부의 코드가 오류를 던지는 객체에 관계없이 실행을 계속한다는 것입니다. 원인은 무엇일까요? – Daniel

+1

@ 대니얼 그건 불가능합니다. 생성자가 던져 버리면 프로그램은 직접'catch' 문으로 넘어갑니다. 여기에서 유일한 합리적인 설명은 당신이 무슨 일이 일어나고 있는지 오해하고 있다는 것입니다. 예외를 던지고있는 생성자 (이 경우'Type :: Type()')가 정말로 확실합니까? –

+0

안녕하세요, 저는 실제로 그것을 알아 냈습니다. 내 대답을 아래에서 확인하십시오. 결국 누군가가 대답하기를 바랍니다. – Daniel