{
개요
이번 포스팅은 예외를 발생시키는 좋은 예와 잡아낼 때 좋은 예를 정리하는 것에 그 목적을 두고 있다.

본문
예외는 어떻게 발생 시킬 수 있는가?
 예외는 try 구문 내에서 throw a; 형태로 발생 시킬 수 있다. 이 때 a 는 어떠한 타입도 가능하다. 즉, 포인터,기본형, 객체형이 가능하다는 뜻이다.

이렇게 발생된 예외는 어떻게 잡을 수 있는가?
catch 구문을 통해서 잡을 수 있다. 다음과 같이 catch( int a ) 형태 이다. 위의 a가 int 형이라면 잡을 수 있다. 만약 int 형이 아니라면, 잡을 수 없고 try catch 구문 밖으로 예외는 자동으로 나가게 된다.

예)

이처럼 catch문으로 예외를 잡을 수 있다.

왜 책에선 예외를 값의 형태로 발생 시키라고 했는가?
 값이 아닌, 포인터로 전달 할 경우, 전달된 메모리를 어떻게 처리 해야 할지, 관리를 해야 하기 때문에 귀찮아 진다. 그래서 값으로 발생시키라는 것이다.

부득이하게 참조형으로만 발생을 시켜야 한다면, 어떻게 해야 하는가?
 이럴 경우에는 진짜로 참조형으로 밖에 할 수 없는지 다시 한번 생각해 보고, 어쩔수 없다면 boost::shared_ptr 등을 이용하여 객체형으로 만드는 것이 좋다.

이렇게 발생된 예외를 왜 catch(참조형)으로 해야 하는가?
 두가지 큰 이유가 있다. 첫째로는 다형성을 손쉽게 유지 할수 있기 때문이다. 만약 값에 의한 전달이라면, 값이 복사 되면서 splice 문제를 고려 해야 할 것이다. 두번째로는 불필요한 복사를 막을 수 있다. 만약 값에 의한 전달이라면, 매번 예외가 발생 될 때마다 계속 객체를 복사해야 하는 작업도 같이 하게 될 것이다.

결론
 예외를 발생 시킬 때는, 값으로, 잡을 때는 참조로 하는게 일반적으로 좋다.

참고 문헌
C++ Coding Standard 73, Effective C++, Exceptional C++

}

저작자 표시
신고

'책 정리 > 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 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요