본문 바로가기
Programming/열혈 C++ 프로그래밍(저자 윤성우)

Ch 15. 예외처리(Exception Handling)

by minjunkim.dev 2020. 8. 18.

    모든 내용은 [윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어] 를 기반으로 제 나름대로 이해하여 정리한 것입니다. 다소 부정확한 내용이 있을수도 있으니 이를 유념하고 봐주세요!


# C++의 예외란?
- 프로그램의 "실행(런타임) 도중" 발생하는 문제상황
- 컴파일시 발생하는 문법적인 에러는 범주에서 제외
- 즉, 문법적인 오류가 아닌 프로그램 논리에 맞지 않는 상황

- 예외처리를 위한 코드와 프로그램의 흐름을 구성하는 코드를 쉽게 구분하기 위해

C++의 예외처리 메커니즘을 이용한다.(가독성과 유지보수성 높이기)


1) 예외의 발생위치
2) 예외의 발견위치
3) 예외의 처리위치
=> 모두 위치가 다를 수 있다.

 

- try :
예외발생에 대한 검사의 범위 지정

- catch :
try 블록에서 발생한 예외를 처리하는 코드가 담기는 영역으로,
형태가 반환형 없는 함수와 유사하다.
try와 catch는 하나의 문장으로 항상 이어서 등장해야하며, 중간에 다른 문장은 불가능하다.
=> try 블록 내에서 발생하는 예외는 이어서 등장하는 catch 블록에 의해 처리된다.
try 블록 내에서 예외가 발생하면, 예외가 발생한 지점 이후의 try 블록 영역은 건너뛰고 catch 블록 진행한다.
try 블록 내에서 예외가 발생하지 않으면, try 블록 영역을 전부 진행한 후, catch 블록을 건너뛰게 된다.

- throw:
예외가 발생했음을 알리는 문장의 구성에 사용됨
e.g. throw expn; // expn은 예외객체(예외데이터)
throw에 의해 던져진 예외객체는, 예외객체를 감싸는 try 블록에 의해 감지 되어,
이어서 등장하는 catch 블록에 의해 처리된다.
throw절에 의해 던져진 예외객체의 자료형과
catch 블록의 매개변수의 자료형은 일치해야 catch 블록으로 예외객체가 전달된다.
자료형이 일치하는 catch 블록이 없으면, 이 함수를 호출한 영역으로 예외객체를 전달(throw)한다.

# try 블록을 묶는 기준?
- 하나의 work 단위로 구성하자.

# 예외의 전달
- 예외가 처리되지 않으면, 예외가 발생한 함수를 호출한 영역으로

예외 데이터가 (더불어 예외처리에 대한 책임까지) 전달된다.(스택풀기, 스택의반환)
- 함수 내에서 함수를 호출한 영역으로 예외를 전달하면,
해당 함수는 더이상 실행되지 않고 종료된다.

- 계속 예외가 처리되지 않고 전달되는 것이 반복되어
main 함수마저도 이 예외를 처리하지 않으면 프로그램은 종료된다.(terminate 함수호출)

# 예외 클래스와 예외 객체 - 이것이 보다 일반적인 예외 데이터이다.
- 예외 객체는 일반적으로 예외 클래스의 임시객체의 형태로 생성하는데,

임시객체를 생성한 곳에는 임시객체의 참조값이 반환되므로,

이 참조값을 throw를 통해 catch 구문의 매개변수로 전달한다.
- 예외클래스 역시 상속의 형태(추상클래스 이용)로 좀 더 예외 처리를 단순화 가능하다.

 

# catch 구문을 여러개 사용시 if elseif... 구문과 동일한 형식으로 검사하기에,
상속관계를 갖는 예외 객체 처리의 경우 주의가 필요하다.

(다형성으로 인해 제일 밑단의 유도클래스부터 catch로 검사해야한다.)

# new 연산자에 의해서 발생하는 예외
new에 의해 메모리 할당 실패시, 헤더파일 <new>의 bad_alloc 예외객체가 발생한다.

# catch 블록에 전달된 예외는 다시 던져질수 있어서
한 예외가 둘 이상의 catch 블록에 의해 처리될 수도 있다.


[출처] : 윤성우 저, "열혈 C++ 프로그래밍", 오렌지미디어