[C++] 예외처리
예외의 개념
예외(exception)란 프로그램이 수행되는 도중에 정상적이지 않은 사건이 발생하는 것을 말한다.
예외가 발생할 수 있는 대표적인 상황
- 변수의 값에 따라 연산을 수행하지 못하는 경우
- 사용자의 입력이 프로그래머가 기대한 것과 다른 경우
- 프로그램에서 자원을 필요로 할 때 컴퓨터가 자원이 부족한 경우
C++ 언어의 예외처리 체계
C++ 언어에서는 데이터의 오류, 시스템 자원(기억장치 공간, 입출력 장치)의 부족 등과 같은 비정상적이지만 예측할 수 있는 예외에 대처할 수 있는 예외처리 방법을 지원한다.
예외처리의 기본
C++ 언어의 예외처리 체계는 try 블록과 catch 블록, 그리고 throw 문장으로 구성된다.
ReturnTypa1 someFunction()
{
.....
try { //예외가 발생할 수 있는 부분
someDangerousFunction();
}
catch(eClass e) { //발생한 예외를 처리하는 부분;
exceptionProcRtn();
}
.....
}
ReturnType2 someDangerousFunction()
{
if(예외검출조건)
throw eObj; //예외 발생을 알림
else
정상적인 처리;
}
모든 예외 검출
catch의 매개변수를 엘립스(...)로 표현한 catch 블록은 모든 종류의 예외를 포착할 수 있다.
catch(...) {
//예외처리
}
여러개의 catch 블록이 사용될 때 가장 마지막에 두어 앞의 catch 블록에서 검출하지 못한 예외를 처리하기 위하여 주로 사용한다.
noexcept 함수
어떤 함수가 예외를 일으키지 않는 것이 명백하다면 그 함수를 noexcept 함수로 선언할 수 있다.
noexcept 함수는 함수 머리에 noexcept 키워드를 사용한다.
int neFunction() noexcept
{
....
}
예외처리 클래스
에외의 처리는 발생한 예외에 맞게 선별적으로 이루어저야 한다. 예외에 따라 선택되는 catch 블록은 예외 객체의 내용이 아니라 예외 객체의 자료형(클래스)이므로 문자열이나 정수 등 일반적인 자료형의 예외 객체를 사용하는 것 보다는 예외의 요인별로 정의된 예외 클래스의 객체를 사용하는 것이 좋다. 이를 위해 예외처리 클래스를 사용할 수 있다.
클래스에 예외처리 기능을 포함시키면, 객체에서 예외가 발생할 때 어느 부분에서 예외가 발생하였는지, 어떤 원인에 의하여 예외가 발생하였는지 쉽게 식별할 수 있다.
exception 클래스
C++ 언어는 내부적으로 예외를 처리하기 위하여 기초 클래스인 exception을 정의하고 있다.
- 예외의 종류를 문자열로 반환하기 위하여 사용하는 가상함수 what()을 가지고 있다.
- 상속 받기 위해 코드의 맨 처음 부분에 헤더 파일 <exception>을 포함시켜야 한다.
class BadIndex : pulbic exception {
public :
int wrongIndex;
BadIndex(int n) : wrongIndex(n), exception() {}
const char* what() const return "Array Exception::";
};
예외처리 클래스의 상속
예외처리 클래스도 상속을 받을 수 있다. 어떤 클래스가 public으로 내포되어 있는 예외처리 클래스를 포함하고 있다고 가정하자. 이 클래스에 대한 유도 클래스는 자신의 내부에서 별도의 예외처리 클래스를 정의할 수 있으며, 이 예외처리 클래스는 기초 클래스에 포함되어 있는 예외처리 클래스를 상속받아 정의될 수 있다.
출처 : 전중남·이병래. 「C++프로그래밍」. 한국방송통신대학교출판문화원. 2020