Post

[ STUDY/Effective C++ ] 2022. 8. 17. 19:44

c++은 예외를 내보내는 소멸자를 좋아하지않는다.

당연하다. 소멸자가 그냥 조용히 소멸하는것이 아닌 예외까지 발생하면 프로그램의 불완전 종료 나 미정의 동작의 위험을 내포하고있기때문이다.

 

하지만 항사 우리가 원하는대로 코드를 짤 순 없다.

만약에 예외를 던지고 실패할 수 있는 코드를 소멸자에 넣어한다면 어떻게 해야할까

 

1. 프로그램 바로 끝내기

DBConn::~DBConn()
{
	try {db.close(); }
    catch (...) {
    	close 호출이 실패했다는 로그 출력;
        std::abort();
	}
}

abort를 호출해서 못 볼꼴을 미리 안보여준다.

 

 

2. 예외 삼켜버리기(무시하기)

DBConn::~DBConn()
{
	try {db.close(); }
    catch (...) {
    	close 호출이 실패했다는 로그 출력;
	}
}

발생한 예외를 그냥 무시하더라도 프로그램이 신뢰성 있게 지속될 경우에만 사용하자.

 

 

3. 사용자가 직접처리하기

void close()
{
	db.close();
    closed = true;
}

DBConn::~DBConn()
{
	if(!closed)
	try {db.close(); }
    catch (...) {
    	close 호출이 실패했다는 로그 출력;
        ...//실행끝내거나 예외무시
	}
}

사용자함수를 만들어 DBConnection이 닫혔는지 여부를 유지가능하며 사용자가 에러를 처리할 수 있는 기회를 가질 수 있다. 닫히지않았다면 DBConn의 소멸자에서 닫을 수도 있다. 

 

이렇게하면 데이터베이스 연결이 누출되지않으나, 소멸자에서 호출하는 close마저 실패한다면 다시 위의 1,2번 처럼 돌아올 수 밖에 없긴하다.

 

 

 

▲ top