[Effective C++] 8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자
728x90
반응형
제목의 의미는 소멸자에서 예외가 빠져나오지 않도록 처리하자는 것을 의미한다.
소멸자가 호출되는 경우
- 정상적으로 객체가 종료되었을 때
- 예외처리 메커니즘에 의해 객체가 소멸될 때
위에서 예외처리 메커니즘에 의해 객체가 소멸될 때 또 예외가 발생한다면, terminate함수가 호출되어 프로그램이 종료된다. 따라서 try~catch로 예외를 소멸자 내에 묶어 두어야 한다.
아래의 코드를 보면,
class DBConnection
{
public:
static DBConnection create(); // DB 생성
void close(); // 연결 닫기
}
----
class DBConn
{
public:
~DBConn()
{
db.close(); // DB 연결 닫기
}
private:
DBConnection db;
}
DBConn이 소멸할 때 db.close를 호출하며 이때 예외가 발생한다면 프로그램은 미정의 동작을 발생시킬 것이다.
따라서 위의 해결 방법대로 Try~Catch를 이용해 예외를 소멸자에 묶어 프로그램의 미정의 동작을 방지할 수 있는데 이때 취할 수 있는 방법으로는 두 가지가 있다.
1. 프로그램을 바로 끝낸다.
DBConn::~DBConn()
{
try
{
db.close();
}
catch(...)
{
// close 호출이 실패했다는 로그 작성
std::abort();
}
}
2. 예외를 무시한다.
DBConn::~DBConn()
{
try
{
db.close();
}
catch(...)
{
// close 호출이 실패했다는 로그 작성
}
}
3. 예외가 호출될 수 있는 부분을 소멸자가 아닌 사용자가 호출할 수 있게 제공한다.
class DBConn
{
public:
void close()
{
db.close();
closed = true;
}
~DBConn()
{
if(!closed)
{
try
{
db.close();
}
catch(...)
{
// close 호출 실패 로그
}
}
}
private:
DBConnection db;
bool closed;
}
위와 같이 예외 발생 시 그 예외는 소멸자가 아닌 다른 함수에서 호출되어야 한다.
이렇게 된다면 사용자가 에러가 발생할만한 가능성이 있는 코드를 원하는 타이밍에 호출할 수 있으므로 에러에 잘 대처할 수 있다.
요약
- 소멸자에서는 예외가 빠져나가면 안 된다. 만약 소멸자 안에서 호출된 함수가 예외를 던질 가능성이 있다면, 어떤 예외이든지 소멸자에서 모두 받아낸 후에 무시하거나 프로그램을 끝내거나 해야 한다.
- 어떤 클래스의 연산이 진행되다가 던진 예외에 대해 사용자가 반응해야 할 필요가 있다면, 해당 연산을 제공하는 함수는 반드시 보통의 함수(즉, 소멸자가 아닌 함수)이어야 한다.
728x90
반응형
'Books > Effective C++' 카테고리의 다른 글
[Effective C++] 10. 대입 연산자는 *this의 참조자를 반환하게 하자 (0) | 2022.05.14 |
---|---|
[Effective C++] 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 (0) | 2022.05.14 |
[Effective C++] 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 (0) | 2022.05.13 |
[Effective C++] 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자 (0) | 2022.05.09 |
[Effective C++] 5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2022.05.08 |
댓글
이 글 공유하기
다른 글
-
[Effective C++] 10. 대입 연산자는 *this의 참조자를 반환하게 하자
[Effective C++] 10. 대입 연산자는 *this의 참조자를 반환하게 하자
2022.05.14 -
[Effective C++] 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자
[Effective C++] 9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자
2022.05.14 -
[Effective C++] 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
[Effective C++] 7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자
2022.05.13 -
[Effective C++] 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자
[Effective C++] 6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자
2022.05.09