2014-04-22 3 views
1

C++에서 예외 처리를 처음 사용하고 최근에 약간의 문제가 발생했습니다.C++ 생성자 예외 처리

제 코드에서는 객체 하나를 만들고 싶습니다. 나는 생성자에게 입력을 제공해야하는 라이브러리와 인터페이스하고있다. 내 문제는 생성자 자체가 예외를 던질 수 있다는 것입니다

ObjectA my_object(param1, param2, param3); 

: 다음과 같은 생성자를 호출이 보일 것이다거야. 과거에 예외적으로 제한된 작업을 해봤지만 (try-catch 메커니즘에 대해 알고 있습니다.) 변수 범위로 인해 무엇을해야할지 모르겠습니다. 예를 들면 다음과 같습니다.

try { 
    ObjectA my_object(param1, param2, param3); 
} 
catch { 
    // don't worry I need to do more than this here, just an example... 
    cout << "OMFG!" << endl; 
    exit(EXIT_FAILURE); 
} 
// if code got here, everything with my_object is OK 
my_object.Method1(param1); // ERROR: my_object is out of scope! 

빠른 도움말에서 올바르게 작성된 개체를 확인할 수 있도록 도와 주시면 감사하겠습니다. 감사합니다

+1

넣어 모든 것을 : 부스트와 같은 on't, optional는 선택 사양 일이 너무 위협하는 경우 배치 새로운 작품)

, 그것은 쉽게뿐만 아니라 동적 메모리를 통해 복제 얼마나 알고 있다면 자신을 구현하기가 매우 간단하다 try 블록 안의 객체와 관련이있다. – Dialecticus

답변

2

글쎄, 상기 try 블록이 큰하는 것입니다 경우

try { 
    ObjectA my_object(param1, param2, param3); 
    my_object.Method1(param1); 
    // other work 
} 
catch (/* the exception that constructor can throw */){ 
    // error handling stuff 
} 

가 다른 함수에의 코드를 이동합니다. 행동의 수가 작은 경우

1
void doStuff() 
{ 
    ObjectA my_object(param1, param2, param3); 
    my_object.Method1(param1); 
} 

try { 
    doStuff(); 
} 
catch { 
    // don't worry I need to do more than this here, just an example... 
    cout << "OMFG!" << endl; 
    exit(EXIT_FAILURE); 
} 

또는 모든 관련 문을 try 블록 안에 넣기 만하면됩니다. 이 같은

2

, 때때로 당신은이 작업을 수행 :

ObjectA my_object; //may or may not be valid by itself 
try { 
    my_object = ObjectA(param1, param2, param3); //initialize and copy-construct 
    //alternatively: 
    my_object.open(param1, param2, param3); 
}catch(...) 
{exit(EXIT_FAILURE);} 
my_object.Method1(param1); 

: 생성자가 예외를 던질 수 있다면

try { 
    ObjectA my_object(param1, param2, param3); 
    my_object.Method1(param1); 
}catch(...) 
{exit(EXIT_FAILURE);} 

일반적으로, 예외없이 initailize하는 다른 방법이 존재한다 그렇지 않은 경우 가장 권장되는 솔루션은 다음과 같습니다.

boost::optional<ObjectA> my_object; //make it OPTIONAL 
try { 
    my_object = ObjectA(param1, param2, param3); //initialize and copy-construct 
}catch(...) 
{exit(EXIT_FAILURE);} 
my_object.Method1(param1); 

std::unique_ptr<ObjectA> my_object; //make it OPTIONAL 
try { 
    my_object.reset(new ObjectA(param1, param2, param3)); //initialize and copy-construct 
}catch(...) 
{exit(EXIT_FAILURE);} 
my_object->Method1(param1);