C++ 예외들의 주목적은, 오동작을 방지하는 프로그램을 설계할 수 있도록 언어 차원에서 지원하는 것입니다.

최신 C++ 컴파일러들은 언어 자체에 예외들을 포함시키고 있습니다.

exception헤더 파일은 다른 예외 클래스들의 기초 클래스로 사용하는 exception 클래스를 정의합니다.

exception 객체를 발생시키거나 기초 클래스로 사용할 수 있습니다. 

exception 클래스는 what()이라는 하나의 가상 멤버 함수가 주어집니다.

시스템의 특성에 따라 하나의 문자열을 리턴합니다.

#include <iostream>
#include <exception>
class Exce : public std::exception {
public:
       const char* what() {
              return "문제가 있습니다.";
       }
};
void Func1() {
       throw Exce();
}
int main(void) {
       try {
              Func1();
       }
       catch (Exce & e) {
              std::cout << e.what() << std::endl;
       }
       return 0;
}

try블록에서 예외 데이터형이 Exce라면 "문제가 있습니다."라고 출력합니다.

what 멤버 함수가 가상이기 때문에 캐치 블록에서 exception클래스가 잡는다고 해도 내가 원하는 문자열을 출력할 수 없습니다.

 

stdexcept 예외 클래스

stdexcept 헤더 파일은 몇 가지 예외 클래스들을 더 정의합니다.

이 헤더 파일은 logic_error runtime_error 클래스를 정의합니다.

이 클래스들은 exception으로부터 public으로 파생됩니다.

 

logic_error 클래스

logic_error는 일반적인 논리 에러들을 서술합니다.

또 logic_error클래스로부터 파생되는 4개의 클래스가 있습니다.

즉 클래스 계층은 아래와 같습니다.

exception -> logic_error -> 각 클래스들

 

domain_error

std::sin함수에 매개변수를 전달하는 함수를 작성한다면 매개변수가 -1에서 +1까지의 정의역을 벗어날 때 그 함수가 domain_error 객체를 발생시키도록 할 수 있습니다.

 

invalid_argument

기대하지 않는 값이 함수에 전달되었다는 것을 사용자에게 경고합니다.

예를 들면 "Hello" 또는 "World" 둘 중 하나만 받기를 함수가 기대한다면 둘 중에 해당하지 않는 문자열이 나타났을 때 invalid_argment 예외를 발생시킬 수 있습니다.

 

length_error

해당 예외는 원하는 액션을 취할 만큼 충분한 공간을 사용할 수 없다는 것을 나타내는 데 사용됩니다.

하나의 예로 string 클래스는 결과로 얻어지는 문자열이 최대 허용 문자열 길이보다 더 클 때 length_error 예외를 발생시키는 append메서드를 가지고 있습니다.

 

out_of_bounds

일반적으로 인덱싱 에러들을 나타내는데 사용됩니다.

예를 들면 사용된 인덱스가 그 배열에 대해 적절하지 않으면 operator()[]가 out_of_bounds 예외를 발생시키는 배열 비슷한 클래스를 정의할 수 있습니다.

 

runtime_error 클래스

logic_error클래스와 다르게 예측이 어렵고 예방도 어려운, 실행하는 동안에 나타날 수 있는 에러들을 서술합니다.

runtime_error 클래스로부터 파생되는 3개의 클래스가 있습니다.

즉 클래스 계층은 아래와 같습니다.

exception -> runtime_error -> 각 클래스들

 

range_error

언더 플로나 오버플로 없이 계산 결과가 함수의 적절한 치역을 벗어날 수도 있습니다. 이러한 상황일 때 사용할 수 있습니다.

 

overflow_error

오버플로우일 때

 

underflow_error

언더플로우 일 때

 

마무리하며

이러한 클래스들은 일부 STL 함수에서 예외 발생으로 사용되는 경우도 있으나, 보통 사용자가 직접 확인하고 예외를 발생시켜야 합니다.

 

 

댓글을 달아 주세요