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 함수에서 예외 발생으로 사용되는 경우도 있으나, 보통 사용자가 직접 확인하고 예외를 발생시켜야 합니다.
댓글