Effective C++/Effective C++
[Effective C++] 8. 소멸자 호출 중 예외 문제
김디트
2024. 5. 22. 10:37
728x90
항목 8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자.
C++은 예외를 내보내는 소멸자를 좋아하지 않는다.
- '소멸자에서 예외 발생'은 미정의 사항이다.(컴파일러 구현에 따라 다르게 반응한다.)
- 그러므로 소멸자에서는 예외를 던지지 않도록 처리해야 한다.
소멸자가 예외를 던지지 않게 하는 두 가지 방법
- 예외 발생 시 프로그램을 종료시킨다
- 에러 발생 후 프로그램 실행을 계속할 수 없는 상황이라면 이 선택지
- 예외를 삼켜버린다
- 발생한 예외를 무시해도 프로그램이 신뢰성 있게 실행 지속되어야 한다는 보장이 된다면 이 선택지
- catch에서 어떤 처리도 해주지 않음으로써 예외를 삼켜버릴 수 있다.
소멸자에서 예외 발생하는 부분을 “사용자가 제어할 수도 있게” 함수를 제공해준다.
- 사용자에게 예외 처리를 처리할 수 있는 선택권을 주도록 한다.
- 예외를 처리할 필요가 있으면 그 예외는 소멸자가 아닌 다른 함수에서 비롯되어야 한다.
class DBConn{
public:
// 예외 발생 가능 기능을 노출하여,
// 사용자가 원하는 때 처리할 수 있도록 함수 제공
void close()
{
_db.close();
}
// 사용자가 close 함수를 사용하지 않았을 경우
// 1. 프로그램 종료, 2. 예외 삼킴
// 두 옵션 중 하나를 선택하여 처리해준다.
~DBConn() {
try
{
_db.close();
}
catch(....)
{ .... }
}
private:
DB _db;
};
728x90