일지

Effective C++...7

niamdank 2022. 6. 6. 18:01

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

소멸자에서 예외를 회피하는 방법

먼저, 소멸자에서 예외가 발생하는 경우 디버깅이 거의 불가능하므로 예외가 발생하지 않는 게 가장 좋다.

하지만 예외가 발생하는 경우엔 두 가지 방법으로 처리를 할 수 있다.

  1. 소멸자에서 예외 발생 시 로그를 출력하고 프로그램을 종료한다.
  2. 소멸자에서 예외 발생 시 로그를 출력하고 예외를 소멸시킨다.

 

※ 사용자에게 선택권이 없으므로 둘 다 좋은 방법은 아니다.

 

사용자에게 선택권을 부여하는 방법

소멸자에서 호출하던 Close 함수가 있었다면 이 함수를 사용자가 호출할 수 있도록 한다면 예외 발생 시 사용자 스스로 디버깅을 진행할 수 있게 된다.

 


class DBConn {

public:

    ...

    void close()

    {

        db.close();

        closed = true;

    }

    ~DBConn()

    {

        if (!closed)

        try {

            db.close();

        }

        catch (...) {

            close 호출 실패했다는 로그 출력

        }

    }

private:

    DBConnection db;

    bool closed;

}