항목 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 항목,
}


저작자 표시
신고

'책 정리 > C++ Coding Standards : C++ 코딩의 정석' 카테고리의 다른 글

C++ Coding Standard : 코딩의 정석 목차  (0) 2009.05.04
항목 75 : 예외 명세표는 만들 필요가 없다. ( Avoid exception specifications. )  (0) 2009.05.04
항목 74 : 목적에 맞게 오류를 보고하고, 제어하고, 변환하라. ( eport, handle, and translate errors appropriately. )  (0) 2009.05.02
항목 73 : 예외를 발생시킬 때에는 값으로 하고, 잡아낼 때에는 참조로 하라. ( Throw by value, catch by reference. )  (0) 2009.05.02
항목 72 : 오류 보고에는 예외를 활용하라. ( Prefer to use exceptions to report errors. )  (0) 2009.05.02
항목 71 : 오류로부터 안전한 코드를 디자인하고 작성하라. ( Design and write error-safe code. )  (0) 2009.04.29
항목 70 : 어디까지가 오류인지 명확히 해두자. ( Distinguish between errors and non-errors. )  (0) 2009.04.28
항목 69 : 합리적인 오류 처리 방식을 수립하고, 엄격히 그 방식을 따르라. ( Establish a rational error handling policy, and follow it strictly. )  (0) 2009.04.17
항목 68 : 내부적인 가정과 규칙을 확실하게 명시하라. ( Assert liberally to document internal assumptions and invariants. )  (0) 2009.04.17
항목 100 : 배열을 다형적으로 다루어서는 안된다. ( Don’t treat arrays polymorphically. )  (0) 2009.04.17
항목 99 : 올바르지 않은 개체와 안전하지 않은 함수는 사용하지 말라. ( Don’t use invalid objects. Don’t use unsafe functions. )  (0) 2009.04.17
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요