스토리텔링 개발자

[Effective C++] 8. 소멸자 호출 중 예외 문제 본문

개발/Effective C++

[Effective C++] 8. 소멸자 호출 중 예외 문제

김디트 2024. 5. 22. 10:37
728x90

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

 

 

 

C++은 예외를 내보내는 소멸자를 좋아하지 않는다.
  • '소멸자에서 예외 발생'은 미정의 사항이다.(컴파일러 구현에 따라 다르게 반응한다.)
  • 그러므로 소멸자에서는 예외를 던지지 않도록 처리해야 한다.

 

 

 

소멸자가 예외를 던지지 않게 하는 두 가지 방법
  1. 예외 발생 시 프로그램을 종료시킨다
    • 에러 발생 후 프로그램 실행을 계속할 수 없는 상황이라면 이 선택지
  2. 예외를 삼켜버린다
    • 발생한 예외를 무시해도 프로그램이 신뢰성 있게 실행 지속되어야 한다는 보장이 된다면 이 선택지
    • catch에서 어떤 처리도 해주지 않음으로써 예외를 삼켜버릴 수 있다.

 

 

 

소멸자에서 예외 발생하는 부분을 “사용자가 제어할 수도 있게” 함수를 제공해준다.
  • 사용자에게 예외 처리를 처리할 수 있는 선택권을 주도록 한다.
  • 예외를 처리할 필요가 있으면 그 예외는 소멸자가 아닌 다른 함수에서 비롯되어야 한다.
class DBConn{ 
public:
	// 예외 발생 가능 기능을 노출하여,
    // 사용자가 원하는 때 처리할 수 있도록 함수 제공
    void close()
    {
    	_db.close();
    } 
    
    
    // 사용자가 close 함수를 사용하지 않았을 경우
    // 1. 프로그램 종료, 2. 예외 삼킴
    // 두 옵션 중 하나를 선택하여 처리해준다.
    ~DBConn() { 
          try 
          {
          	_db.close();
          } 
          catch(....)
          { .... } 
    } 
    
private:
	DB _db;
};
728x90
Comments