Post
[ STUDY/Effective C++ ]
2022. 8. 17. 19:44
c++은 예외를 내보내는 소멸자를 좋아하지않는다.
당연하다. 소멸자가 그냥 조용히 소멸하는것이 아닌 예외까지 발생하면 프로그램의 불완전 종료 나 미정의 동작의 위험을 내포하고있기때문이다.
하지만 항사 우리가 원하는대로 코드를 짤 순 없다.
만약에 예외를 던지고 실패할 수 있는 코드를 소멸자에 넣어한다면 어떻게 해야할까
1. 프로그램 바로 끝내기
DBConn::~DBConn()
{
try {db.close(); }
catch (...) {
close 호출이 실패했다는 로그 출력;
std::abort();
}
}
abort를 호출해서 못 볼꼴을 미리 안보여준다.
2. 예외 삼켜버리기(무시하기)
DBConn::~DBConn()
{
try {db.close(); }
catch (...) {
close 호출이 실패했다는 로그 출력;
}
}
발생한 예외를 그냥 무시하더라도 프로그램이 신뢰성 있게 지속될 경우에만 사용하자.
3. 사용자가 직접처리하기
void close()
{
db.close();
closed = true;
}
DBConn::~DBConn()
{
if(!closed)
try {db.close(); }
catch (...) {
close 호출이 실패했다는 로그 출력;
...//실행끝내거나 예외무시
}
}
사용자함수를 만들어 DBConnection이 닫혔는지 여부를 유지가능하며 사용자가 에러를 처리할 수 있는 기회를 가질 수 있다. 닫히지않았다면 DBConn의 소멸자에서 닫을 수도 있다.
이렇게하면 데이터베이스 연결이 누출되지않으나, 소멸자에서 호출하는 close마저 실패한다면 다시 위의 1,2번 처럼 돌아올 수 밖에 없긴하다.
'STUDY > Effective C++' 카테고리의 다른 글
항목 10 : 대입 연산자는 *this의 참조자를 반환하게 하자 (0) | 2022.08.24 |
---|---|
항목 9 : 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자 (0) | 2022.08.17 |
항목 7: 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자 (0) | 2022.06.25 |
항목 6: 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해버리자 (0) | 2022.06.23 |
항목 5: C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자 (0) | 2022.06.23 |