항목 71 : 오류로부터 안전한 코드를 디자인하고 작성하라
{
라고 .. 책에는 적혀 있다. 번역하다가 Exception 이 오류라고 된거 같다. 본 내용은 예외로부터 안전한 코드를 디자인하고 작성하는 것을 이야기 하는 것이다.

개요
이 포스팅은 발생된 예외:Exception으로 부터 프로그램을 보호해야 하는 이유와 어떤 보호방법들이 있는지, 어떻게 보호해야 하는지에 대해서 정리해 둔 것이다.

본문
발생된 예외로 부터 왜 프로그램을 보호해야 하는가?
 보호를 할지 말지는 프로그래머가 정하는 일이다. 만약 "나는 보호하지 않겠어" 라고 한다면, 이 포스팅을 읽지 않아도 된다.

예외가 발생 했을 경우, 그 예외는 자신의 지역에서 처리 할 수 있는 곳이 있는지 살펴보고, 있다면 그곳에 머물러 처리가 될 테니지만, 그렇지 않다면, 밖으로 튀어 나간다.

이 밖으로 튀어나가는 성질 때문에, 스택이 되감기게 된다. 이 때, 현재의 프로그램 상태를 보호하지 않는다면, 오염되어 프로그램을 신뢰할 수 없게 되는 것이다.

그러므로 예외로 부터 안전한 코드를 작성해야 하는 것이다.

그럴꺼면 애초에 예외를 발생 시키지 않으면 되지 않을까?
 애초에 예외를 발생시키지 않는게 제일 좋은 방법이지만, 예외를 절대 발생키지 않는것은 현실적으로 너무 어렵다. 왜냐하면, API 수준에서 예외를 발생 될 수도 있기 때문이다.

예외에 안전한 코드는 무엇을 말하는 가?
예외에 안전한 코드는 메모리 누수 없애는 것, 개념을 독립 시키는 것, 작업을 독립시키는 것, 작업을 분리하는 것을 의미한다. 이것은 보다 디버깅에 용이하고, 유지보수가 편해지는 것을 뜻한다.

예외에 안전한 코드를 어떻게 만드는 가?
수 많은 사람들이 예외에 안전한 코드를 만들다가 다들 비슷한 개념을 쓰고 있는 것을 알게 되었고, 대표적으로 3가지 분류로 나누어 예외에 안전한 코드를 작성하게 되었다.

첫째, 기본적인 보장을 갖는 예외에 안전한 코드
기본적인 보장은 예외가 발생했을 때, 프로그램 상태에 영향을 미치지 않게 한다는 의미이다. 예를 들어 메모리 누수라 든지, 프로그래의 흐름이라든지 이런 것들을 건들지 않게 하겠다는 것이다.

둘째, 강한 보장을 갖는 예외에 안전한 코드
강한 보장은 예외가 발생했을 때, 기본적인 보장에 주변 상태를 작업하기 전 상태로 되돌려 놓겠다는 의미가 추가되는 의미를 갖는다. 예를 들어, a = 1, b = 2, c = 1 이라고 할 때, c = a + b 의 연산시 예외가 발생 해도 c = 1 의 상태를 유지한다는 것이다.

셋째, 무실패 보장을 갖는 예외에 안전한 코드
무실패 보장은 연산이 절대 실패하지 않겠다는 보장을 뜻한다. 위의 예에서 c = a + b 가 절대로 성공하게 한다는 뜻이다.

그렇다면 각 코드는 어떻게 짜는가?
첫째, 기본적인 보장


둘째, 강한 보장


셋째, 무실패 보장
operator= 안에 new 를 하기 때문에, 무실패는 보장 할 수 없다. 위의 코드에서 무실패 보장은 RAII::swap 함수 이다. 무실패 보장을 하기 위해선 stack에서만 작업 하고, 기본연산만 이용하면 된다.

예)
int a = 3;
int b = 4;
int c = 5;

c = a + b;


참고 문헌
Exceptional C++ Style 12 항목, Effective C++ 8 항목,
}


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기