익셉션(예외)이란?
C++은 유연성이 뛰어난 반면 안전성은 좋지 않다.
메모리 공간을 무작위로 접근하거나 0으로 나누는 연산을 수행하더라도 컴파일러는 가만히 수행한다.
이처럼 C++에 안전성을 좀 더 높이기 위해 제공하는 기능 중 하나가 익셉션(예외)이다.
익셉션이란 예상하지 못한 상황을 표현하는 클래스/객체이다.
예상하지 못한 상황에 대처하는 방법은 그 함수에서 nullptr이나 에러 코드와 같은 특수한 값을 리턴하는 것이다.
코드에서 특정한 조건을 만족해서 익셉션을 발생시키는 것을 익셉션을 던진다(발생시킨다)고 표현하고,
throw 구문으로 작성한다.
또한 이렇게 발생한 익셉션을 대해 적절한 동작을 수행하는 것을 익셉션을 잡는다(받는다, 처리한다)고 표현하고,
catch 구문으로 작성한다.
throw 구문
divideNumbers()란 함수를 만들어 익셉션을 던지고 잡는 예를 살펴보자.
이 함수가 전달된 분모의 인수가 0이면 익셉션을 발생시킨다.
std::invalid_argument란 익셉션을 사용했는데, 이러면 <stdexcept> 헤더 파일을 불러와야 한다.
double divideNumbers(double numerator, double denominator)
{
if (denominator == 0) {
throw invalid_argument("Denominator cannot be 0.");
}
return numerator / denominator;
}
throw 문장이 실행되면 함수에서 값을 리턴하지 않고 실행을 즉시 중단한다.
이처럼 익셉션이 발생하는 함수를 호출할 때는 다음 코드처럼 try/catch 블록으로 감싼다.
그러면 함수에서 익셉션이 발생할 때 적절히 대처할 수 있다.
try/catch 구문
다음은 분모가 0일때 익셉션을 발생시키는 코드이다.
#include <iostream>
#include <stdexcept>
using namespace std;
double divideNumbers(double numerator, double denominator)
{
if (denominator == 0) {
throw invalid_argument("Denominator cannot be 0.");
}
return numerator / denominator;
}
int main()
{
// 익셉션 함수 호출
try {
cout << divideNumbers(2.5, 0.5) << endl;
cout << divideNumbers(2.3, 0) << endl;
cout << divideNumbers(4.5, 2.5) << endl;
}
catch (const invalid_argument& exception) {
cout << "Exception cauht: " << exception.what() << endl;
}
return 0;
}
결과

divideNumbers()를 처음 호출할 때는 정상적으로 실행돼 결과가 화면에 출력된다.
두 번째로 호출할 때는 익셉션이 발생한다.
아무런 값도 리턴되지 않기 때문에 익셉션을 잡았다는 에러 메시지만 화면에 출력된다.
익셉션이 발생해서 프로그램의 실행 흐름이 바로 catch 블록으로 건너뛰었기 때문이다.
세 번째 호출하는 문장은 실행되지 않는다.
익셉션을 처리하는 코드를 따로 작성하지 않으면 프로그램 자체에서 처리하는데,
그러면 프로그램이 그냥 종료된다.
'💻프로그래밍 내용 정리 > C++17' 카테고리의 다른 글
[C++ 1.3.1] 클래스 정의, 접근 수준(public, private), 생성자(생성자 이니셜라이저), 소멸자 (0) | 2022.08.17 |
---|---|
[C++ 1.2.6] 타입 추론(auto, decltype) (0) | 2022.08.16 |
[C++ 1.2.4] 레퍼런스, Const 레퍼런스 (0) | 2022.08.16 |
[C++ 1.2.3] Const의 다양한 용도 (0) | 2022.08.16 |
[C++ 1.2.2] 스택과 힙, 포인터와 동적 메모리, 역참조, 배열 포인터, 널 포인터 상수(NULL), 스마트 포인터(unique_ptr, shared_ptr) (0) | 2022.08.16 |