C++에서 말하는 '예외(Exception)' 는 프로그램의 실행 도중에 발생하는 문제상황을 의미한다.
따라서 컴파일 시 발생하는 문법적인 에러는 예외의 범주에 포함되지 않는다.
ex) 나이를 입력하는데 0보다 작은 값이 입력되었다.
나눗셈을 위한 두 개의 정수를 입력 받는데, 제수로 0이 입력되었다.
주민등록번호 13자리만 입력하라고 했더니, 중간에 -를 포함하여 14자리를 입력하였다.
이렇듯 '예외' 라는 것은 문법적인 오류가 아닌, 프로그램의 논리에 맞지 않는 상황을 의미한다.
0으로 나누는 연산은 불가능하므로, 프로그램이 강제로 종료되어버린다.
예외가 발생하면, 그에 따른 처리가 이뤄져야지, 위의 실행결과에서 보이듯이 그냥 프로그램이 종료되어버리는 상황을 만들어서는 안 된다.
if 문을 이용한 예외의 처리
if문을 이용한 예외처리는 "에외처리를 위한 코드와 프로그램의 흐름을 구성하는 코드를 쉽게 구분하지 못하게 한다."
※ if문이 등장하면 에외처리를 위한 코드라고 생각하고, 주석을 달 수 있다.
하지만! 프로그램의 논리적인 기능의 완성을 위해서도 if문은 사용된다. 그리고 예외가 아닌 다른 정보의 기록을 위해서도 주석은 사용된다.
즉, if문과 주석만을 사용해서는 딱 보고 예외처리라고 판단할 수 없다.
C++ 의 예외처리 메커니즘
- C++ 은 구조적으로 예외를 처리할 수 있는 메커니즘을 제공한다. 이 메커니즘을 이용하면, 코드의 가독성과 유지보수성을 높일 수 있다.
예외의 처리를 프로그램의 일반적인 흐름에서 독립시키는 것이 가능하기 때문이다.
try 예외를 발견
catch 예외를 잡는다.
throw 예외를 던진다.
try 블록
- try 블록은 예외발생에 대한 검사의 범위를 지정할 때 사용된다. 즉, try 블록 내에서 예외가 발생하면, 이는 C++의 예외처리 메커니즘에 의해서 처리가 된다.
try
{
// 예외발생 예상지역
}
catch 블록
- catch 블록은 try 블록에서 발생한 예외를 처리하는 코드가 담기는 영역으로써, 그 형태가 마치 반환형 없는 함수와 유사하다.
catch(처리할 예외의 종류 명시)
{
// 예외처리 코드의 삽입
}
throw
- 키워드 throw는 예외가 발생했음을 알리는 문장의 구성에 사용된다.
- ex) throw expn;
expn은 변수, 상수 그리고 객체 등 표현 가능한 모든 데이터가 될 수 있으나, 예외상황에 대한 정보를 담은, 의미 있는 데이터이어야 한다. 그래서 위 문장에서 expn의 위치에 오는 데이터를 가리켜 그냥 '예외'라고 표현하기도 한다.
※ try와 catch는 하나의 문장이다. 따라서 항상 이어서 등장해야 한다.
따라서, try 블록 내에서 발생하는 예외는 이어서 등장하는 catch 블록에 의해 처리된다.
=> throw에 의해 던져진 '예외 데이터'는, '예외 데이터'를 감싸는 try 블록에 의해서 감지가 되어 이어서 등장하는 catch 블록에 의해 처리된다.
즉, 예외가 발생하면(throw 절이 실행되면), 프로그램의 흐름이 중지되고, catch 블록에 의해서 예외의 처리과정을 거치게 되는데 이것이 바로 C++ 의 예외처리 메커니즘이다.
try 블록 내에서 예외가 발생하면, catch 블록이 실행되고 나서, 예외가 발생한 지점 이후를 실행하는 것이 아니라, catch 블록의 이후가 실행됨을 보인다.
이렇듯, 예외가 발생하면, 예외가 발생한 지점 이후의 나머지 try 영역은 그냥 건너뛰게 된다.
그리고 throw절에 의해 던져진 예외 데이터의 자료형과 catch 블록의 매개변수 자료형은 일치해야 한다. 만약 일치하지 않으면, 던져진 예외 데이터는 catch 블록으로 전달되지 않는다.
try 블록을 묶는 기준
- try 블록을 만나면 그 안에 삽입된 문장이 순서대로 실행된다.
- try 블록 내에서 예외가 발생하지 않으면 catch 블록 이후를 실행한다.
- try 블록 내에서 예외가 발생하면, 예외가 발생한 지점 이후의 나머지 try 영역은 건너뛴다.
묶는 기준 : 예외가 발생할만한 영역만 묶는 게 아니라, 그와 관련된 모든 문장을 함께 묶어서 이를 하나의 '일(work)' 의 단위로 구성하는 것이다.
"try 블록 내에서 예외가 발생하면, 예외가 발생한 지점 이후의 나머지 try영역은 건너뛴다."