본문 바로가기
C,C++

[Effective C++] 항목 8: 예외가 소멸자를 떠나지 못하도록 붙들어 놓자.

by matters_ 2019. 7. 22.

오늘은 두번째 시간!  

오늘은 소멸자에서 예외가 발생할 경우를 대비해 예외처리를 잘 해주자에 대해서 이야기한다.

데이터베이스의 연결이 항상 닫히도록 하는 함수를 db.close라고 하자.

그러면 소멸자에 db.close라는 함수를 작성하면 된다.  

하지만 db.close에서 오류가 발생할 경우 즉, 연결을 닫다가 오류가 발생하면 문제가 발생한다. 메모리 누수등 여러 문제가 발생할 수 있기 때문에 try catch로 프로그램을 바로 끝내는 코드를 작성하자는 것이다.

하지만 필자는 다음과 같은 코드가 제일 좋다고 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class DBconn {
public:    
    void close(){
    db.close();
    closed = true;
    }
 
    ~DBconn()
    {
    if(!closed)
    {
    try{
    db.close();
    }
    catch (){
    //close 호출이 실패하였는다는 로그 작성
    //...
    }
}
cs

코드에서 알 수 있겠지만 소멸자에서 불리기전 close()라는 사용자함수에서 먼저 db.close()를 먼저 불러준다

그러면 db.close()에서 예외가 발생하더라도 closed가 false 인 상태이므로  DBconn 객체가 소멸할 때 한번 더 확인하여 닫아준다는 원리이다. 보다 안정성있는 프로그램이 되었다고 생각할 수 있다.

실제 많이 쓰이는지는 잘 모르겠지만 기본이니 기억해 두도록하자!

댓글