프로그래밍언어/C++

[C++] 예외처리

qkzkdo 2023. 9. 23. 20:28
728x90

예외의 개념

예외(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

728x90