HyeM

More Effective C++[항목13] 본문

Programming/C++

More Effective C++[항목13]

Hailey_HyeM207 2020. 2. 24. 14:35

항목 13 : 발생한 예외는 참조자로 받아내자

 

catch문 작성시, 예외객체가 전달되는 방식

1 포인터   2 값    3 참조자에 의한 전달(예외받기)

 

TIP!

    : 문제점

    : 해결점


1. 포인터

예외를 포인터로 발생시, 객체의 복사 X

위의 코드는 완벽하지 않다.

프로그램 흐름이 떠나더라도, 예외 객체가 그대로 남아 있을 수 있는 방법이 필요하다.

이에 대한 대안은 힙 객체를 새로 만들고, 그 객체의 포인터를 예외로 발생시킨다.

이로써 위의 문제는 해결되지만, catch문으로 들어온 포인터를 삭제하느냐 마느냐의 문제가 생긴다.

만약 예외객체가 원래부터 힙에 할당되지 않은 것이면, 메모리 해제를 해선 안된다.

하지만 이를 알 수 있는 방법이 없으므로, 이런 경우는 피하는 것이 좋다.

 

또한 '포인터에 의한 예외잡기'는 c++에서 기본적으로 제공되는 표준 예외 4개인데, 이 표준예외는 객체에 대한 포인터가 아니라 모두 객체 이다. (따라서, 참조자에 의한 예외받기를 통하지 않으면, 이 예외들을 쓸 수 없다.) 

 

 

 

포인터 정리

문제1 . catch문으로 들어온 포인터를 삭제하느냐 마느냐의 문제

문제2 . C++표준예외를 사용할 수 없음.

 


2. 값에 의한 예외받기

 

값에 의한 예외받기는 '포인터에 의한 예외받기'와 달리,

예외를 삭제하느냐 마느냐의 고민도 없애주고, C++표준 예외하고도 잘 맞는다.

 

하지만, 예외 객체는 늘 두 번씩 복사 되고, 슬라이드 문제도 생긴다.

 

*슬라이드 문제 : 방생 시에는 파생 클래스의 객체였다가, 기본 클래스를 받는 catch문에 들어가면서 파생 클래스 부분에 추가되었던 데이터가 잘려나가는 현상.

 

▼예제보기

더보기

 

발생한 예외의 타입이 Validation_error이고 Validation_error에서 가상 함수 what을 재정의했다고 해도, 호출되는what은 Validation_error가 아니라 기본클래스의 것이다.

(슬라이스 문제)

 

 

값 정리

문제1 . 예외객체는 항상 두 번씩 복사됨

문제2 . 슬라이드 문제

 


3. 참조자에 의한 예외받기

포인터와 값에 의한 예외받기의 문제를 모두 겪지 않는다.

=> 참조자를 이용하면 문제를 생각하지 않아도 된다!!

 

▼예제보기

더보기

catch문에만 &를 추가하면 , 우리가 원하는 대로 동작한다.

재정의만 제대로 해두었으면 Validation_error의 what()이 호출된다.

 

'Programming > C++' 카테고리의 다른 글

More Effective C++[항목21-24]  (0) 2020.03.16
More Effective C++[항목16-20]  (0) 2020.03.10
More Effective C++[항목14]  (0) 2020.02.26
More Effective C++  (0) 2020.02.22
More Effective C++  (0) 2020.02.20
Comments