방프리

17.07.04. Effective C++ 2. 생성자, 소멸자 및 대입 연산자 (항목8) 본문

C++/Effective C++

17.07.04. Effective C++ 2. 생성자, 소멸자 및 대입 연산자 (항목8)

방프리 2020. 1. 5. 00:13

항목 8 : 예외가 소멸자를 떠나지 못하도록 붙들어 놓자

 

- 데이터를 삭제하거나 지울 때 그 과정이 부드럽게 진행이 된다면 그만큼 더할나위 좋을 것이 없습니다. 

하지만 현실은 그러지 못하죠. 분명히 잘 동작하다가도 마지막에 소멸자에서 삭제가 진행되면서 오류가

발생할 수도 있죠

이 때 이 오류에 대한 예외처리는 소멸자에서 발생해서는 안됩니다. 소멸자에서 처리는 가능하지만 그다지

좋은 코드도 아닐 뿐더러 오류에 대한 대책이 마땅히 있는 것도 아니지요

그렇기 때문에 소멸자가 아닌 다른 함수에서 비롯된 것이어야 한다는 말을 프로그래머들은 항상 새기고 있어야 합니다.

다음의 예제 코드를 통해 구현 방식에 대해 숙지하면 될 것 같습니다.

class DBConn //DB를 연결하는 클래스

{

public :

.... //기타 함수

void close()

{

db.close();

closed = true;

}

 

~DBConn()

{

if(!closed)

{

try

{

db.close();

}

catch(...)

{

//close 호출이 실패했다는 로그 작성

}

}

}

 

private:

DBConnection db;

bool closed;

};

 

이것만은 잊지 말자!

 

* 소멸자에서는 예외가 빠져나가면 안됩니다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면,

어떤 예외이든지 소멸자에서 모두 받아낸 후에 삼켜 버리든지 프로그램을 끝내든지 해야 합니다.

 

* 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면,

해당 연산을 제공하는 함수는 반드시 보통의 함수(즉, 소멸자가 아닌 함수)이어야 합니다.

Comments