2015-01-11 2 views
3

저는 C++을 처음 사용하며 다음을 수행 할 수 있는지 또는 더 좋은 방법이 있는지 궁금합니다.try 문에서 초기화 된 객체에 액세스하는 방법

나는 데이터베이스 핸들러에 대한 사용자 정의 예외 클래스가 : 나는 DGeneDB 개체에 대해 수행 할

int main(int argc, char const ** argv){ 
    try { 
     DatabaseHandler DGeneDB = DatabaseHandler("string/to/path"); 
    }catch(DatabaseHandlerExceptions &msg) { 
     std::cerr << "Couldn't open Database" << std::endl; 
     std::cerr << msg.what(); 
     return 1; 
    } 
    DGeneDB.foo() //Can't access this object since it was initialized in try statement 
    return 0; 
} 

내가 억 물건을 가지고 싶지 않아 :이처럼 내 주에서 이것을 사용 try 문 내에서 모든 작업을 수행하십시오. 난 단지 초기화 중에 발생하는 생성자 예외를 잡아 내고 싶다. 시도 밖의 객체로 작업하려면 어떻게해야합니까? 내 말은, 예외를 throw하면 1을 반환하고 다른 객체에 도달하기 전에 main()을 중단합니다.

+0

try 블록 내부의 모든 작업을 수행하십시오. 하지만 이것이 사용자 정의 예외 클래스를 갖는 것과 어떤 관련이 있습니까? – juanchopanza

+0

왜'try' 블록 밖에서 액세스해야합니까? –

+0

어, 고마워. – jwillis0720

답변

2

귀하의 Databasehandler에는 open 방법 또는 이와 유사한 것이 있습니까? 그렇지 않다면 하나를 만들고 생성자를 수정하여 데이터베이스 연결을 더 이상 열지 않도록합니다. 코드는 다음과 같습니다

DatabaseHandler DGenDB; 
try { 
    DGenDB.open(dbpaths.Dgene_db); 
} 
catch (DatabaseHandlerExceptions &msg) { 
    return 1; 
} 

참고 :를 원래 코드에서이 같은 라인이 있습니다

C에서 변수를 초기화 할 수있는 특별한 방법입니다
DatabaseHandler DGeneDB = DatabaseHandler(dbpaths.Dgene_db); 

++를. 다음과 같이 작성하면됩니다.

DatabaseHandler DGeneDB(dbpaths.Dgene_db); 
+0

이것은 RAII 원칙에 위배된다. (당연히 따라야하는 것은 아니다.) –

+0

@MattMcNabb'std :: ifstream'이나'std :: ofstream'과 같은 방식은 아니다. 'open'메소드를 가지고 있더라도 소멸자에서 연결을 닫지 못하도록하지는 마십시오. –

+0

'fstream'이'open()'함수와 마찬가지로 RAII 원칙에 위배됩니다.그러나 RAII는 이동 의미가 없으면 성 가시고, 따라서'fstream'에서'open()'함수를 사용하는 것이 타당합니다. IMHO. 새 코드의 경우이 작업을 반복해서는 안됩니다. 즉각적인 요청에 대한 가장 간단한 해결책은 객체를 외부에 선언하고 초기화 된 객체를 try 블록 내부로 이동하는 것입니다. –

관련 문제